gpt4 book ai didi

c - 如何通过内存分配特性来衡量int和short变量的大小?

转载 作者:行者123 更新时间:2023-11-30 18:41:08 26 4
gpt4 key购买 nike

我尝试在我的电脑(X86_64)上测试intshort类型的长度,所以我写了两段代码如下:简短:

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

两者都可以工作并输出正确的答案,但是当我将数字 1 更改为 4 时,第一个工作正常,而第二个显示 Segmentation输入后出现错误
有资料说x86中short和int的长度都是16位,不知道x86_64中的区别,是一样的吗?另外,是什么导致了Segmentation failure

PS:我使用gcc -Wall -O2 -o filename -lm来编译。

最佳答案

所有 x86 ABI 都定义 sizeof(short) == 2
所有 x86 16 位 ABI 都定义 sizeof(int) == 2,所有其他 x86 ABI 定义 sizeof(int) == 4。对于标准 64 位模式,每个指针都是 64 位 == 8 字节大小,对于 64 位 4G 地址模式和 32 位平面内存模式(平面是标准),每个指针都是 32 位 == 4 字节,对于 16 位模式则有所不同。

此示例具有未定义行为,因为您在 &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));

未定义的行为意味着任何事情都可能发生,甚至是众所周知的鼻恶魔。
这包括它似乎可以工作以及重新格式化您的驱动器

关于c - 如何通过内存分配特性来衡量int和short变量的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23038665/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com