2014-02-18 1 views
1

참조로 함수의 1 차원 배열을 전달하려고합니다. 다음은 관련 코드입니다.배열 (구조체의 멤버)을 함수로 전달합니다.

void function1(); 
void function2(struct template *); 

struct template{ 
     char array[11]; 
}; 

function1() 
{ 
    struct template myStruct = {0}; //initializing 

    function2(&myStruct); 
} 

function2(struct template *myStruct) 
{ 
    void writeToArray(char array[11]); //locally declaring a function 

    writeToArray(myStruct->array); 
} 

void writeToArray(char array[11]) 
{ 
    /*** stuff ****/ 
} 

이제이 코드를 디버깅 할 때 예기치 않은 결과가 발생합니다. writeToArray()를 입력하면

p sizeof(array) 

으로, 4를 반환합니다. 11의 값을 반환하지 않아야합니까?

모든 변수의 "sizeof"는 컴파일 타임에 정적으로 설정된다는 것을 알고 있습니다. 그렇다면 컴파일러는 writeToArray()의 "char array [11]"을 size == 4로 고려하는 이유는 무엇입니까?

답변

0

void writeToArray(char array[11])을 선언하면 실제로는 다음과 같이 선언됩니다. void writeToArray(char *array).

'쇠퇴하기'를 보면 더 많은 것을 알 수 있습니다.

따라서 sizeof(array)을 수행하면 포인터의 크기가 달라집니다.

이 배열 크기를 유지하려면 void writeToArray(char (&array)[11])을 대신 사용해보십시오.

이것은 배열을 참조로 전달한 다음 크기가 11 인 배열로 선언합니다. sizeof에서 예상 한 값을 반환합니다.

참고 : 방법을 사용해도 값 11을 하드 코딩하므로 const 값을 선언하고 sizeof을 모두 잊어 버리는 것이 좋습니다. 또는 크기를 하드 코딩하는 이유를 다시 고려하십시오.

0

배열을 인수로 함수에 전달하면 배열의 시작 주소가 함수에 전달됩니다. 여기서 참조는 지정된 메모리 위치이며 호스트 시스템에서 4 바이트의 메모리를 차지합니다.