2012-04-10 1 views
2

는 :sizeof char ** 포인터는 컴퓨터 아키텍처에 종속적입니까? 나는 다음과 같은 코드를 실행하면

int main() 
{ 
    char **temp; 
    printf("Size of **temp %d", sizeof(**temp)); 
    printf("Size of *temp %d", sizeof(*temp)); 
    printf("Size of temp %d", sizeof(temp)); 
    return 0; 
} 

를 내가 얻을 :

Size of **temp 1 
Size of *temp 8 
Size of temp 8 

어떤 방법 char 포인터가 8의 크기가 않습니다되어 이해가 안? 그것은 기계 독립적입니까?

+1

여기에 크기를 전혀 인쇄하지 않았습니다. 그냥 값. –

+0

예, 컴퓨터, OS 및 컴파일러에 따라 다릅니다. 가장 일반적인 포인터 크기는 4 바이트 (32 비트) 및 8 바이트 (64 비트)입니다. – Blastfurnace

+0

@JamesMcLaughlin : 시스템에서 출력물을 잘 생성 할 수 있습니다. 그는 초기화되지 않은 메모리를 역 참조합니다. –

답변

5

원래 질문에서 당신은 sizeof이 아니 었습니다.
duskwuff이 수정되었습니다.

제조 출력이었다

Size of **temp 1 
Size of *temp 8 
Size of temp 8 

이유 : 64 비트 아키텍쳐

, 포인터는 (관계없이 가리 것에) 8 바이트이다

**temp is of type char ==> 1 byte 
    *temp is of type pointer-to-char ==> 8 bytes 
    temp is of type pointer-to-pointer-to-char ==> 8 bytes 
+0

음 ... 이것은 내 코드와 정확히 똑같습니까? 내가 여기서 뭔가를 놓치고 있니? – noMAD

+2

@noMAD : 게시 한 원본 코드에'sizeof() '가 없습니다. – Blastfurnace

+0

게시 한 질문의 첫 번째 버전에서는 Sizeof를 호출하지 않았습니다. 누군가가 질문을 편집하여 실수를 수정했습니다. – abelenky

7

이를 sizeof 문자 **,이 컴파일러에 의존하는 기계

따라 기계 이상의 구조에 따라 포인터의입니다. 동일한 크기로 항상 신뢰할 수있는 유일한 크기는 sizeof(char) == 1입니다.

1

포인터 크기는 시스템에 따라 다릅니다. 이해가 안 무엇

는 문자 포인터가 8

의 크기 숯불 포인터를 가질 않는 방법이다, 즉 char* 변수가 시스템에, 8의 크기를 가지고있다. 코드에서 sizeof(*temp)은 char 포인터의 크기를 제공하며 8입니다. 이유는 sizeof(**temp)이 1 인 이유는 **tempchar이고 sizeof(char)이 정의에서 1이라는 것입니다.

+0

'프로그램의 모든 포인터가 같은 크기입니다. '- 확실합니까? – asaelr

+0

@asaelr 예 확신합니다 –

+1

음, http://stackoverflow.com/a/1241314/1055952 – asaelr

1

sizeof 연산자는 COMPILE TIME에서 컴파일러에 의해 처리됩니다. 런타임에는 실제 추론이 발생하지 않습니다. 연산자의 크기에 의한 리턴은 유형의 크기입니다. 타겟 플랫폼은 다음 (온도)를 sizeof 64 비트 포인터가있는 경우, 상기 타겟 플랫폼이 될 다음 (온도)를 sizeof 128 비트 포인터를 갖는다면

sizeof(*(char *)0) is 1 

제 될 것이라고 16

" 타겟 "은 크로스 컴파일 할 수 있기 때문에 컴파일하는 플랫폼을 의미하지는 않습니다.

0
Size of **temp 1 
Size of *temp 8 
Size of temp 8 

정답입니다. 왜?

Because 
Size of **temp 1--->> pointing to char. 
Size of *temp 8----->>pointing pointer to char. 
Size of temp 8---->>>>pointing pointer to pointer to char. 

및 32 비트 컴파일러에이 코드를 실행한다면 당신은 당신이 64 비트 컴퓨터에 MS 비주얼 스튜디오를 실행하는 경우 그것은 당신에게

Size of **temp 1 
Size of *temp 4 
Size of temp 4 
2

을 줄 것이다 64 비트 컴파일러를 사용하고, 당신이 할 수있는 솔루션 플랫폼을 win32에서 x64로 변경하여 포인터의 크기가이 코드로 4에서 8 바이트로 증가하는지 확인하십시오.

1

포인터의 크기는 컴퓨터에 따라 다릅니다 (컴퓨터 유형 확인). 컴퓨터가 64 비트이면 포인터 크기는 8 바이트이고 의 경우 32 비트 컴퓨터 포인터 크기는 4 바이트입니다.

변수 포인터가 가리키는 포인터의 유형과 관계없이 포인터 크기는 동일합니다. 포인터 유형은 포인터 산술에 더 유용합니다. sizeof 연산자를 사용할 때 크기와 혼동하지 마십시오.