2016-09-26 3 views
3

누군가가 C로 메모리 할당에 대해 말해 줄 수 있습니까? char 변수의 크기는 얼마입니까? 2 또는 4? 배열의 인접한 두 char 요소 사이의 주소 값의 차이가 왜 1입니까?sizeof Char/Array 길이 C로 메모리 할당

char foo [] = {'a', 'b'}; 
printf ("This is the Address of val1 %d \n", &foo[1]);   // -1079295441 
printf ("This is the Address of val2 %d \n", &foo[2]);   // -1079295440 
printf ("The size of each array member is %d \n", sizeof(foo)); // 2 
+0

'foo'는 문자 배열이며, 기본적으로 포인터이기 때문에 다른 배열과 크기가 같습니다. – apokryfos

+0

"char 변수의 크기는 2 또는 4입니까?" 1 – samgak

+1

@apokryfos입니다. 배열은 포인터가 아닙니다. 요소 유형 및 용량에 따라 다양한 크기가 있습니다. –

답변

3

당신은 제대로 주소를 인쇄되지 않은 : 당신이 그것을 인쇄 할 %d을 사용할 수 있도록 주소, int 없습니다. 대신 ("포인터"를) %p 사용하여 인쇄 void*에 주소를 캐스팅 :

printf ("This is the Address of val1 %p\n", (void*)&foo[1]); 

이제 프로그램이이 식물 또는 유사한 출력을 생성합니다

This is the Address of val1 0xffbd2fcf 
This is the Address of val2 0xffbd2fd0 
The size of each array member is 2 

두 포인터 1, 뒤로 이동을하는 단일 char의 크기입니다. 전체 배열의 크기는 2입니다. 단일 요소의 크기를 인쇄하려면 foo[0]을 사용하십시오.

+0

@Oka이 답변에는 과도한 캐스트가 없습니다. –

+1

@ 오카 필수 항목입니다. '% p'는'void *'를 원하므로'int * '를 넘기는 것은 UB로 간주됩니다. – dasblinkenlight

+0

아, 이것은 'void *'에 대한 포인터를 안전하게 승격하는 것을 제외하고는 예외입니다. 이 문제는 varargs와 관련이 있습니까? 흥미 롭 군. – Oka