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
未定义的行为
,因为您没有在
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
阅读您的评论和答案后,我知道我的代码有什么问题。 我猜想一个变量的地址是在汇编语言中,因此,如果我获得一个地址并将其添加为变量的长度,我可以获得以下可行的地址。 我首先使用
printf("size of pointr: %d\n", sizeof(short*));
来测试&a+4
的长度是否为
int
为什么这起作用?现在,我明白了。 在以下代码中:
4 BYTES
IT的输出是:Segmentation fault
和
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
函数。 感谢您的回答和评论,即使它们不是我想要得到的。