如何通过内存分配特征来测量int和短变量的大小? 我试图测试我的计算机中的int和短类型的长度(x86_64),所以我写了两种代码,就像bellow: 短的: 短a; scanf(“%HD%HD”,&A和A+1); printf(“%hd”,a+*(&a+1)); ...

问题描述 投票:0回答:3
short

键的长度(x86_64),所以我写了两件代码,就像bellow: 简:

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));

工作和输出正确的答案,但是当我更改为number

1
4

Segmentation fault
时,第一个效果很好,而第二个则显示输入后。 一些材料说,短和int的长度在x86中都是16位,我不知道x86_64的差异,它们是一样的吗? 另外,是什么原因造成的?
PS:我用
Segmentation fault
来编译。
	
所有X86 ABIS定义

gcc -Wall -O2 -o filename -lm

。 所有X86 16位ABIS定义

sizeof(short) == 2
,所有其他X86 ABIS定义

sizeof(int) == 2
c x86-64
3个回答
3
投票
这个示例具有

未定义的行为

,因为您没有在
sizeof(int) == 4
中拥有
short
-object

&a+1

为此而已,只是用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));
的大小:

short
您可以得到printf("size of short: %d\n", sizeof(short)); 指针的大小: short


0
投票

阅读您的评论和答案后,我知道我的代码有什么问题。 我猜想一个变量的地址是在汇编语言中,因此,如果我获得一个地址并将其添加为变量的长度,我可以获得以下可行的地址。 我首先使用

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

&a+4
的长度是否为
int

为什么这起作用?现在,我明白了。 在以下代码中:

4 BYTES

IT的输出是:
Segmentation fault


0
投票
4


输出为:

1
表明,这里加上
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

&a + 1
的大小,而不是
int a

函数。 感谢您的回答和评论,即使它们不是我想要得到的。


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.