2013-12-12 3 views
1

두 가지 간단한 예 : 것을 왜테이블이 함수의 매개 변수 일 때 테이블의 "sizeof()"가 올바르지 않은 이유는 무엇입니까?

int main(void) 
{ 
... 
send("datadata"); 
... 
} 

void data(int table2[]) { 
int size2 = (sizeof(table2)/sizeof(*(table2))) - 1; 
} 

SIZE2 항상 3의 크기입니다 : 때

int table1[] = "datadata"; 
int size1 = (sizeof(table1)/sizeof(*(table1))) - 1; 

크기가 정확하지 않습니다 때

크기가 올바른 값이 될 것이다 ? 올바른 값을 얻는 방법?

+3

이 함수는 데이터 블록의 주소를받습니다. 길이를 측정 할 수 없습니다. – Novak

+2

그래서 먼저 테이블의 값을 계산해야하고 다음 패스는 테이블 옆의 함수입니다. 마찬가지로 :'무효 데이터 (int table2 [], int size)'? – user3096513

+0

예, 크기를 다른 인수로 전달하십시오. – marcus

답변

0

첫 번째 경우 컴파일러는 table의 크기와 유형 (상수)을 알고 있습니다. 따라서 char 배열의 크기를 계산할 수 있습니다.

두 번째 함수는 배열의 주소 만받습니다. 0x00F25255에 정수 배열이 있는데 그 값을 합산 해 주어야합니다. 당신은 분명히 할 수 없습니다. 왜냐하면 당신은 그것이 얼마나 멀리 있는지 모르기 때문입니다.

이 문제를 해결하려면 배열의 길이를 나타내는 다른 매개 변수를 추가하기 만하면됩니다.

예는 int main(int argc, char *argv[]) 일 수 있으며, args은 전송 된 인수의 수입니다.

0

함수가 정수 배열의 주소를 가져 오므로 포인터와 같습니다. 그리고 플랫폼 포인터는 4 바이트 길이입니다.

1

배열을 함수에 전달할 때마다 포인터가 "감쇠"됩니다. 즉, void data(int table2[])void data(int* table2)과 같습니다.

당신이 함수에 배열을 전달하려면

,이 같은 길이에 대해 별도의 인수를 사용

void data(int table2[], int length) 

이 자체 (C)하면 main() 함수에 argc 매개 변수를 사용하여 무엇이다.