2010-06-07 4 views
-4

어떻게하면 런타임에 포인터가 차지하는 공간을 얻을 수 있습니까?공간 복잡도

+14

당신이 무엇을 요구하는지 아십니까? – SLaks

+4

제목이 질문과 무슨 관련이 있습니까? 제목을 바꿔 주실 수 있습니까? – wilhelmtell

+0

당신은 _address_를 의미합니까? –

답변

5

'유형'이라고하는 유형을 상상해보십시오. "int"일 수도 있고 멋진 구조 일 수도 있습니다.

type *p; 

를 sizeof (p) p에 대한 포인터 = 크기 (즉, 그 가능성 PC에서는 'P'의 데이터가 저장되어있는 어드레스를 저장하는데 필요한 바이트의 수. 4 일거나 8 비트는 32 비트 또는 64 비트 아키텍처를 사용하는지에 따라 다르지만 보장되지는 않습니다. 다른 아키텍처에서는 거의 모든 것이 될 수 있습니다)

sizeof (* p) = p 유형의 크기; 'type'에 데이터를 저장하는 데 사용 된 바이트 수입니다.

중요 참고 :

당신은이 작업을 수행하는 코드가 표시 될 수 있습니다이 경우

p = malloc(sizeof(*p)+100) 

을, 충분한 메모리는 '종류'와 여분의 100 바이트를 저장하기 위해 할당됩니다. 그러나 'sizeof (* p)'를 수행하면 여분의 100 바이트가 아니라 'type'에 필요한 메모리가 반환됩니다. C에서 할당 된 메모리 양을 알 수있는 방법이 없습니다. 당신은 자신을 관리해야합니다. 주의 할

+2

포인터 크기가 크게 다를 수 있습니다. 필자가 사용하는 임베디드 컴파일러에는 16 비트와 24 비트 포인터가 있습니다. 24 비트 포인터는 주소에 16 비트를 할당하고 메모리 유형을 지정하기 위해 8 비트를 할당합니다 (8051과 같이 많은 메모리 유형이있는 하버드 아키텍처 칩과 함께 사용됩니다). 포인터가 특정 메모리 공간을 대상으로 지정되면 8 비트 지정자를 제거 할 수 있으며 16 비트 포인터가 있습니다. 따라서 특정 아키텍처와 컴파일러가 주어진 경우에도 포인터의 크기는 다양 할 수 있습니다. – daotoad

+0

그들은 다양하지만 내가 아는 한 그들은 항상 크기가 2^n 비트 인 CPU 레지스터에 수용됩니다. 예 : 68000에는 24 비트 공간 주소가 있지만 a0-a7 레지스터는 32 비트 폭 레지스터입니다 ... 주소에는 "특수 24 비트 전용"레지스터가 없습니다. 하지만 32 비트 값을 레지스터에 올려 놓고 쓰고 싶다면 32 비트 값을 a0-a7/d0-d7 regs에 입력하는 것과 같은 방법으로 수행합니다. 그래서 모든 포인터는 항상 정수로 생각할 수 있습니다. 레지스터를 유지하기에 충분한 크기의 레지스터에 "적합"합니다. 16 비트가 가능한 모든 메모리를 처리하기에 충분하다면 8051의 주소 공간은 16 비트입니다. 그렇지 않습니까? – ShinTakezou

+1

@ShinTakezou 확실히 24 비트 주소 레지스터를 가진 아키텍처가 존재합니다! – James

0

것은 그냥 변수에 유형 자체에 sizeof하지를 할 수 있다는 것입니다 :

// Check if the pointer size of a generic data pointer is different 
// than the pointer size of a function 
if (sizeof(void *) != sizeof(int (*)())) 
{ 
    ... 
} 
1

문제는 다소 모호하지만, 내 생각 :

printf("Size of pointer is: %zu\n", sizeof(*p)); 

해야 네가 원하는 걸해라. 포인터는 부호없는 정수 크기이므로 % zu는 % d의 insted로 사용됩니다.

+1

+1은 z 수정 자에 대해 가르쳐줍니다. –