2014-04-13 2 views
-1

는 내 컴퓨터 (X86_64)에 intshort 유형의 길이를 테스트하려고, 그래서 나는 울부 짖는 소리와 같은 코드의 두 가지 썼다 : 짧은 :메모리 할당 기능으로 int 및 short 변수의 크기를 측정하는 방법은 무엇입니까?

short a; 
scanf("%hd%hd",&a,&a+1); 
printf("%hd",a+*(&a+1)); 

INT :

int a; 
scanf("%d%d",&a,&a+1); 
printf("%d",a+*(&a+1)); 

모두를 작동하고 옳은 대답을 출력하지만 숫자 1에서 4으로 변경하면 첫 번째는 잘 작동하고 두 번째는 입력 후 Segmentation fault이 표시됩니다.
일부 자료에 따르면 short와 int의 길이는 x86에서 모두 16 비트이고 x86_64에서의 차이는 모르지만 동일하다고합니까? 또한 무엇이 Segmentation fault을 발생 시켰습니까?

추신 : 나는 gcc -Wall -O2 -o filename -lm을 사용하여 컴파일합니다.

+1

위의 코드가 어떤 유형의 크기를 결정하는 데 도움이된다고 생각하십니까? –

+0

'sizeof' 표현식을 사용하여 유형의 크기를 결정할 수 있습니다. 'printf ("% d \ n", (int) sizeof (short));' –

답변

0

귀하의 의견과 대답을 읽은 후에 제 코드에 어떤 문제가 있는지 알고 있습니다.
변수의 주소가 어셈블리 언어와 같아서 주소를 가져 와서 변수의 길이를 추가하면 다음과 같은 주소를 얻을 수 있습니다. 나는 int의 길이가 4 BYTES인지 테스트하기 위해 &a+4을 먼저 사용하지만, 실행 중에 Segmentation fault이 있었는데 41으로 변경하고 올바른 값을 얻었는데, 왜 이것이 작동하는지 이해하지 못했습니까? 이제 알았어.

short a,b; 
a = b = 1024; 
cout << &a << endl << &b << endl; 
cout << &a << endl << (&a) + 1; 

그것의 출력은 다음과 같습니다 :

0xbfad153c 
0xbfad153e 
0xbfad153c 
0xbfad153e 

그리고

int a,b; 
a = b = 1024; 
cout << &a << endl << &b << endl; 
cout << &a << endl << (&a) + 1; 
return 0; 

출력은 다음과 같습니다

0xbfddb968 
0xbfddb96c 
0xbfddb968 
0xbfddb96c 

그것은 쇼 다음 코드에서
1
literal const value 그래서 난 그냥 intshort하지 sizeof 함수의 크기를 측정하기 위해 할당 된 메모리의 기능을 사용하려면 &a + 1 여기에 플러스 int a의 크기의 값이 아닌 것이에요.
답변과 의견을 보내 주셔서 감사합니다.

+1

어떤 변수는 * 다음 변수 *입니까? 컴파일러, 컴파일러 플래그, 정확한 소스 및 정확한 상황에 따라 달라집니다 (불안정합니다). 또한, C++에서 * 주소 산술 연산을하지 않으면 포인터 연산 *을 수행합니다. 즉, 내장 된 포인터 유형에 대한 자동 크기 조정이 있음을 의미합니다. – Deduplicator

3

모든 x86 ABI는 sizeof(short) == 2을 정의합니다.
모든 x86 16 비트 ABI는 sizeof(int) == 2을 정의하고 다른 모든 x86 ABI는 sizeof(int) == 4을 정의합니다. 표준 64Bit 모드의 경우 모든 포인터는 64Bit == 8 Byte, 64Bit 4G- 주소 모드 및 32Bit 플랫 메모리 모드 (플랫은 표준), 모든 포인터는 32Bit == 4 Byte, 16Bit 모드는 다양합니다. 단지 int와,이 하나

short a; 
scanf("%hd%hd",&a,&a+1); 
printf("%hd",a+*(&a+1)); 

같은 :

int a; 
scanf("%d%d",&a,&a+1); 
printf("%d",a+*(&a+1)); 

정의되지 않은 동작이 &a+1에서 short -object를 소유하지 않기 때문에

이 예는, 정의되지 않은 동작있다은 속담이있는 코의 악마조차도 어떤 일이 일어날 수도 있음을 의미합니다.
이 포함되어 있습니다.은 드라이브를 다시 포맷했습니다..

0

다음과 같은 방법으로 short의 크기를 얻을 수 있습니다 :

printf("size of short: %d\n", sizeof(short)); 

는 다음과 같은 방법으로, short 포인터의 크기를 얻을 수 있습니다 :

printf("size of pointr: %d\n", sizeof(short*)); 

내가 다른 질문 Deduplicator 응답 한 생각합니다.

+0

'sizeof (void *)'는'sizeof (other_type *)'와 다를 수 있습니다. 현대 시스템에서는 주소 공간이 제한되어있을 때 가장 편리하게 사용할 수있는 방법과 동일합니다. 하지만 항상 그렇지는 않습니다. –

+0

@MattMcNabb 당신이 항상 C++에 대한 지식을 넓히고 싶습니다. 어떤 때는 성가시다. 대부분 교육적인 것입니다. 이 너겟에 대한 언급이 있습니까? –

+0

표준의'[basic.compound]'에서 "포인터 유형의 값 표현은 구현 정의"입니다. * 값 표현 *이라는 용어는 이전 섹션에서 "T 유형의 값을 보유하는 비트 세트"로 정의됩니다. 우리가 포인터에 대해 이야기 할 때, 그것은 포인터를 지키는 비트 집합을 말한 것이지 지적 된 것이 아닙니다. 두 개의 특정 유형에 대한 포인터가 동일한 rep 및 정렬을 가져야하는 경우가 있지만, 모든 포인터가 동일한 rep 및 정렬을 갖는 절은 없습니다. –