2010-04-24 2 views
4

제 질문은 왜 배열의 주소가 첫 번째 위치의 주소와 다른가요?배열의 주소 대 배열 [0]의 주소 ​​- C 언어

나는 내 자신의 malloc을 쓰려고하는데, 시작하기 위해 나는 단지 메모리 덩어리를 할당하고 그 주소로 놀고있다. 내 코드는 다음과 거의 같습니다

#define BUFF_SIZE 1024 
static char *mallocbuff; 

int main(){ 
    mallocbuff = malloc(BUFF_SIZE); 
    printf("The address of mallocbuff is %d\n", &mallocbuff); 
    printf("The address of mallocbuff[0] is %d\n", &mallocbuff[0]); 
} 

& mallocbuff 같은 주소 내가 그것을 실행할 때마다입니다. & mallocbuff [0]은 매번 임의의 주소입니다. 서로 일치하는 주소를 기대하고있었습니다. 아무도 왜 이것이 사실이 아닌지 설명 할 수 있습니까?

+2

배열과 포인터가 항상 같지 않으며 그 반대도 마찬가지입니다. –

+0

주소를 인쇄 할 때 '% d'을 사용하지 마십시오. –

답변

13

&mallocbuffmallocbuff이라는 변수의 주소입니다. &mallocbuff[0]mallocbuff이 가리키는 버퍼의 첫 번째 요소의 주소이며 malloc()으로 할당 한 주소입니다.

+1

다른 말로하면 : mallocbuff == & mallocbuff [0] –

+0

@SB : '% p'를 사용하고 주소를'void * 나에게 너무 늦은 것 같아. 내 게시물에서 나를 정정 주셔서 감사합니다. –

8

mallocbuff은 배열이 아니므로 포인터입니다. 이것은 malloc이 할당하는 곳과 완전히 별개로 저장됩니다.

이것은 당신이 기대하는 결과를 제공 (필요에 따라) 것 :

int main(){ 
    char buf[1]; 
    printf("&buf  == %p\n", &buf); 
    printf(" buf  == %p\n", buf); // 'buf' implicitly converted to pointer 
    printf("&buf[0] == %p\n", &buf[0]); 

    char* mbuf = buf; 
    printf(" mbuf == %p\n", mbuf); 
    printf("&mbuf[0] == %p\n", &mbuf[0]); 

    printf("\n&mbuf(%p) != &buf(%p)\n", &mbuf, &buf); 

    return 0; 
} 

출력 :

&buf  == 0x7fff5b200947 
buf  == 0x7fff5b200947 
&buf[0] == 0x7fff5b200947 
mbuf == 0x7fff5b200947 
&mbuf[0] == 0x7fff5b200947 

&mbuf(0x7fff5b200948) != &buf(0x7fff5b200947) 
4

당신은 (&mallocbuf를 통해) mallocbuf의 주소를 취할 때이 주소를 얻지 못하고있다 배열의 - 당신은 배열을 가리키는 변수의 주소를 얻고 있습니다.

배열의 주소가 mallocbuf 그 자체 (첫 번째 printf()) 만 사용하면됩니다. &mallocbuf[0]