2014-11-24 4 views
0

C sizeof() 함수에 대한 빠른 질문이 있습니다. 함수에 배열을 전달하고 그 함수 안에 배열의 크기를 확인하려고합니다. 내가 checkArraySize 같은 함수를 호출하기 전에, 코드의 상태에서 주석으로함수에 전달 된 배열에 sizeof() 사용

void checkArraySize(char data[]) 
{ 
    int internalSize = sizeof(data); //internalSize is reported as 4 
} 

void main(void) 
{ 
    char data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; 
    int externalSize = sizeof(data); //externalSize is reported as 8 

    checkArraySize(data);            
} 

그러나,에 관계없이 입력 배열의 크기, 함수 내에서 항상 예를 ​​들어 4의 크기를 갖고있는 것 같아요(), 배열의 크기를 확인하고 8 표시합니다. 그러나 함수 안에 배열의 크기를 확인할 때 그것은 단지 4 요소가있는 것으로보고합니다 (입력 요소의 크기에 관계없이 4 개의 요소를보고합니다).

자주 이와 같은 문제가 발생하는 경우 주제에 대한 이해가 부족하기 때문입니다. 그래서 나는 전달 배열이 어떻게 작동하는지에 관해서 뭔가를 놓치고 있다고 확신합니다. 그렇지 않다면 왜 이런 일이 일어나고 있는지에 대한 아이디어가 있습니까?

참고 : 이것은 PIC32에 있으므로 마이크로 칩의 MPLAB X IDE 및 XC32 컴파일러를 사용하고 있습니다.

+0

'sizeof' 함수 아니라, 조작자. 그렇기 때문에 유형 (괄호 사용) 및 표현식 (괄호 사용 필요 없음)에서 사용할 수 있습니다.인수가 가변적으로 수정 된 유형이 아닌 한 인수는 평가되지 않으므로 결과는 컴파일 타임 상수 표현입니다. (임베디드 시스템에 대해 말하지 않았다면,'main'은 항상'int'를 리턴한다고 충고했을 것입니다. 독립적 인 환경에서는 상황이 더 다양합니다.) – Deduplicator

답변

1

C의 배열은 항상 참조로 전달됩니다. 그 이유는 포인터 크기가 매번 나오기 때문이지 실제 크기가 아닙니다.

C에서 배열을 인수로 사용하려면 array와 함께 array의 크기를 전달해야합니다.

I는 작동 상태로 프로그램을 수정 : 참조로 전달

typedef unsigned char BYTE; 

void checkArraySize(BYTE data[], int sizeOfArray) 
{ 
    int internalSize = sizeOfArray; 
    printf("%d", internalSize);     
} 

void main(void) 
{ 
    BYTE data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; 
    int externalSize = sizeof(data)/sizeof(BYTE);     //it would return number of elements in array 

    checkArraySize(data, externalSize);            
} 

어레이의 첫 번째 요소의 어드레스가 전송되는 것을 의미한다. checkArraySize 함수 내에서 아무것도 변경하면이 변경 사항도 원래 배열에도 반영됩니다. 위의 예를 확인하십시오.

typedef unsigned char BYTE; 

void checkArraySize(BYTE data[]) 
{ 
    int internalSize = sizeof(data); 
    printf("%d\n", internalSize);  
    data[3]= 0x02;    //internalSize is reported as 4 
} 

void main(void) 
{ 
    BYTE data[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; 
    int externalSize = sizeof(data);     //externalSize is reported as 8 
    printf("Value before calling function: 0x%x\n",data[3]); 
    checkArraySize(data); 
    printf("Value after calling function: 0x%x\n",data[3]); 
} 

출력 될 것이다 : BTW

Value before calling function: 0x4 
4 
Value after calling function: 0x2 
+0

는 참고로 전달 되었습니까? – tristan

+0

@tristan이 참조로 전달 된 배열의 첫 번째 요소 주소 만 전송됩니다. 함수 ** checkArraySize ** 내에서 아무것도 변경하더라도이 변경 사항은 원래 배열에도 반영됩니다. 나는 답례를 추가했다. – kriyeta

+0

C에 '참조'가 없습니다. 그것은 포인터가 생각하는 배열 부패입니다. – tristan

4
void checkArraySize(char data[]) 

은 그래서, 코드는 포인터의 크기를 계산

void checkArraySize(char* data) 

로 변환됩니다. 4는 컴퓨터의 포인터 크기입니다. 64 비트 시스템에서는 8을 출력합니다.

1

배열은 C 및 C++에서 복사 가능하지 않습니다. 따라서이 언어의 발명가는 프로그래머가 배열을 함수의 인수로 전달할 수있는 방법을 제공하기 위해 배열에서 포인터로 첫 번째 요소로 직관적이지 않은 자동 유형 변환을 추가해야했습니다.

해당 인수에 sizeof 연산자 (함수가 아님)를 사용하면 데이터 크기가 아닌 포인터 유형의 크기가 반환됩니다.

엑스트라 센트 sizeof 연산자는 컴파일 중에 오히려 런타임에 확장됩니다. 다른 쪽에서 함수를 전달한 배열은 다른 크기를 가질 수 있습니다. 그래서 그러한 배열을 포인터로 형 변환하는 것은 또 다른 설명이됩니다. sizeof couldnt은 컴파일 타임 동안 다른 배열의 크기를 해석 할 수 없습니다.

관련 문제