2012-03-07 1 views
0

우리는 다음과 같은 코드가 있습니다sizeof 연산자를 사용하여 C에 변수를 저장하는 데 사용되는 바이트 수를 어떻게 계산합니까?

#include <stdio.h> 
#define LEN 10 

int main(void) { 
    int i; 
    int array[LEN]; 
    int *p; 
    for (i = 0; i < LEN; i++) { 
     array[i] = i; 
    } 
    for (p = &array[0]; p < &array[LEN]; p++) { 
     printf("Address: %p ", p); 
     printf("Value: %d\n", *p); 
    } 
    return 0; 
} 

을 그리고 그것은 단절이 정수 변수를 저장하고, 줄 바꿈에 인쇄하는 데 사용하는 바이트 수를 찾아 우리를 요청하고, 우리에게 sizeof 연산자를 사용할 수있는 힌트를 제공합니다 . 이제

, 나는 포인터 멍청한 놈의 비트를, 그래서 이것은 아마도 정말 빠른 질문이다,하지만 난 인쇄해야합니다 :

printf("Size of int: %d", sizeof(p)); 

또는 sizeof(*p)

한 인쇄 4, 그리고 다른 인쇄물들 8. 나는 8을 ​​향하여 기울어졌습니다 (이것은 단순히 p에서 오는 것입니다). 그것은 메모리 위치를 가리키는 것이지 변수를 가리키는 변수가 아닙니다. 그리고 8은 8 비트를 의미하므로 1 바이트가 답이 될까요?

+3

'8'은 * 8 *을 의미하지 않습니다. 8 바이트를 의미합니다. –

+0

sizeof (p)와 sizeof (* p)에는 차이가 있습니다. 첫 번째는 포인터의 크기이고 다른 하나는 포인터가 가리키는 크기입니다. Andrew Marshall과 동의합니다. 반환되는 값은 비트가 아닌 바이트이며, 표준에 따라 비트가 정의 된 단위 크기로 반환 될 것이라고 생각하지 않습니다. 포인터의 저장소 크기는 일반적으로 int의 크기와 같습니다. 이는 운영 체제가 효율적으로 저장할 수있는 것으로 정의되며 적어도 일반적으로 4 바이트 (32 비트) 또는 8 바이트 (64 비트)만큼 클 수 있습니다. – EdChum

+0

괄호는 중복됩니다. 'sizeof p' 또는'sizeof * p'를 갖는 것이 좋습니다. 'return (0);에 괄호를 사용하지 않습니까? – pmg

답변

3

쉬운 솔루션이 얻을 것은 형식 이름에 sizeof을 사용하는 것입니다

sizeof(int) 
sizeof(int *) 

당신은 대답을 얻을 것이다 당신 혼란없이 필요하다.

+0

와우, 고마워. 그 다음에 빠른 추가 질문. 초기 질문은 16 진수 문자열에서 크기를 결정하도록 요청했는데, 어떻게 할 것인가? 그 중 하나의 문자열은 0x7fff683a1b7c입니다. –

+0

16 진수 문자열? 그게 무슨 뜻 이죠? –

+0

죄송합니다, 아마도 분명하지 않을 것입니다. "다음과 같은 내용이 있습니다 :"int 변수를 bluenose에 저장하는 데 사용되는 바이트 수를 알 수 있습니까? 우리가해야 할 일은 배열의 포인터 주소 (% p 사용)와 포인터가 가리키는 값을 나타내는 16 진수 문자열입니다. 다음 질문은 우리가 이것을 한 후에 sizeof를 사용하도록 요청합니다. –

3

p는 int에 대한 포인터이므로 sizeof (p)는 포인터가 소비하는 바이트 수를 제공합니다. 그래서하는 int (질문)의 크기가 당신이 특정 문제에

sizeof(*p)