2012-07-27 4 views
0

배열에 함수를 전달하는 것에 대해 의문의 여지가 있습니다.배열에 함수를 전달하는 코드

다음 코드 스 니펫을 고려하십시오.

void main() 
{ 
    int a[4]={10,20,30,40}; 
    fun1(a); 
} 

void fun1(int a1[]) 
{ 
    for(int i=0;i<4;i++) 
    { 
     printf("%d\n",a1[i]); 
    } 
} 

배열을 전달하는 것은 첫 번째 위치의 주소를 전달하는 것입니다. 그리고 위의 배열을 그 이름 (배열의 시작 주소)과 함께 전달해야합니다. 의심되는 점은 [4]가 자동 변수이기 때문에 주 기능에서 나올 때 죽어야하며 예기치 않은 결과가 나타납니다 (포인터가 매달려 있어야 함). 하지만 잘 작동합니다.

나는 이것과 매우 혼동 스럽다.

int af(&a)으로 전달하더라도 자동으로 선언 된 경우 함수 f에 존재해서는 안됩니다 (주 기능의 로컬 변수).

이 또한 삭제하십시오.

+0

문제가 해결 된 경우이를 수락 한 것으로 표시하십시오. –

답변

7

예 변수 amain()이 종료 될 때 범위를 벗어납니다.

그러나 fun1이 실행 중일 때 main()은 아직 종료되지 않았으므로 a의 내용은 여전히 ​​유효합니다.

0

int a[]은 함수 선언/정의에서 const int *a과 같으므로 아무런 문제가 없으며 암시 적으로 해제되지 않습니다.

3

무엇을하고 있습니다. 괜찮습니까? 배열 a은 실제로 범위를 벗어나지 만 그 시점까지는 함수가 끝났으므로 더 이상 존재하지 않는 데이터에 액세스하는 것에 대해 걱정할 필요가 없습니다. 변수를 배열 이름으로 전달하는 것에 대한 우려 사항이있는 경우 (잘) 코드를 단계별로 실행하여 자신이 생각하는 데이터에 액세스하는지 확인할 수 있습니다.

또한 4로 하드 코딩하지 않고 배열의 크기를 지정하는 추가 정수 인수를 전달하여 함수를 안전하게 만들 수 있습니다. 함수를 사용하고 길이가 4보다 작은 정수 배열을 전달한 경우 그것은 경계 메모리를 액세스 할 것입니다.

1
  1. void fun1 (int a1 [])은 함수에 들어오는 모든 배열의 복사본을 만듭니다. 그래서 그것은 존재할 것입니다.

  2. 비전을 스택으로 볼 수도 있습니다. main() 메서드에 대한 스택이 만들어집니다. 그리고 fun1()이 main 메소드에서 호출되기 때문에 main 메소드의 스택은 fun1()에 대한 스택이 삭제 될 때만 파괴됩니다.

+1

'fun1'은 배열 사본을 만들지 않습니다. 첫 번째 요소에 대한 포인터 복사본을 만듭니다. –

관련 문제