2012-06-26 4 views
0

다음 코드 비트 ... 어레이 정렬 /를 sizeof() 값을 리턴 여분

void foo(char* x) 
{ 
     int i; 
     int len = sizeof(x)/sizeof(x[0]); 

     printf("len: %d\n", len); 
     for(i=0; i<len; i++){ 
       printf("i: %d, v: %x\n", i, x[i]); 
     } 
} 

...이라고 할 때와 :

 char bar[] = {0xDE, 0xAD, 0xBE, 0xEF}; 
     foo(bar); 

... 출력 :

len: 8 
i: 0, v: ffffffde 
i: 1, v: ffffffad 
i: 2, v: ffffffbe 
i: 3, v: ffffffef 
i: 4, v: ffffffff 
i: 5, v: 7f 
i: 6, v: 0 
i: 7, v: 0 

이렇게 적용 할 수는 있지만 SO와 유사한 게시물을 읽는 것은 확실하지 않습니다.이 문제는 정렬 문제로 보입니다 (저는 64 비트 컴퓨터에있는 것 같습니다).

모든 포인터?

감사합니다.

+0

가능한 중복 [sizeof의을 (포인터 배열을 가리키는) 찾는 방법 (HTTP :/(가) ffffff 대신 charunsigned char 유형을 사용하거나이 같은 unsigned intprintf 인수를 캐스트 할 수 있습니다 피하기 위해 /stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing-to-an-array) –

답변

4

이것은 정렬과 관련이 없습니다.

int len = sizeof(x)/sizeof(x[0]); 

x은 포인터가 아니고 배열입니다. sizeof (x)은 64 비트 컴퓨터에서 8 바이트 인 포인터의 크기를 계산합니다.

ffffffde insteas는 de이므로 정수 승격 (부호 확장이 수행됨)으로 인쇄됩니다.

printf("i: %d, v: %x\n", i, (unsigned int) x[i]); 
+0

설명해 주셔서 감사합니다. C 프로그래밍을 수행 한 이후로 꽤 혼란 스러웠습니다.) 그래서 배열의 길이를 계산할 수있는 방법이 있습니다, 포인터를 deferencing 작동하지 않는 것 같습니다. – Hamza

+1

@Hamza : 배열의 크기를 함수에 전달해야합니다. – caf

+1

함수에 전체 배열을 전달하면 배열의 첫 번째 요소에 대한 포인터로 사라집니다. 즉 배열의 기본 주소가 전달됩니다. 따라서 배열의 크기를 함수에 전달해야합니다. –