Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何通过内存分配特性来度量int和short变量的大小?_C_Compiler Construction_X86 64 - Fatal编程技术网

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

C 如何通过内存分配特性来度量int和short变量的大小?,c,compiler-construction,x86-64,C,Compiler Construction,X86 64,我试图在我的计算机X86_64中测试int和short类型的长度,因此我编写了以下两段代码: 简称: int: int a; scanf("%d%d",&a,&a+1); printf("%d",a+*(&a+1)); 两者都能工作并输出正确答案,但当我将数字改为1到4时,第一个工作正常,而第二个在输入后显示分段错误。 有些材料说,在x86中,short和int的长度都是16位,我不知道x86_64中的区别,它们是相同的吗? 另外,是什么导致了分割错误 PS:我使用gc

我试图在我的计算机X86_64中测试int和short类型的长度,因此我编写了以下两段代码: 简称:

int:

int a;
scanf("%d%d",&a,&a+1);
printf("%d",a+*(&a+1));
两者都能工作并输出正确答案,但当我将数字改为1到4时,第一个工作正常,而第二个在输入后显示分段错误。 有些材料说,在x86中,short和int的长度都是16位,我不知道x86_64中的区别,它们是相同的吗? 另外,是什么导致了分割错误

PS:我使用gcc-Wall-O2-o filename-lm进行编译

所有x86 ABI都定义sizeofshort==2。 所有x86 16位ABI定义sizeofint==2,所有其他x86 ABI定义sizeofint==4。 对于标准64位模式,每个指针的大小为64位==8字节;对于64位4G地址模式和32位平坦内存模式,每个指针的大小为32位==4字节;对于16位模式,指针大小不同

此示例具有未定义的行为,因为您在&a+1处不拥有短对象:

与此相同,仅使用int:

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

您可以通过以下方式获得short的大小:

您可以通过以下方式获得短指针的大小:

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

我相信重复数据消除程序已经回答了您的其他问题。

在阅读了您的评论和回答后,我知道我的代码有什么问题。 我猜一个变量的地址与汇编语言中的地址类似,所以如果我得到一个地址并将其与变量的长度相加,我可以得到下面的地址。我首先使用&a+4来测试int的长度是否为4字节,但在运行时出现了分段错误,我将4改为1并获得了正确的值,我不明白为什么这样做会奏效?现在,我明白了。 在以下代码中:

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

这里显示&a+1加上int a的大小值,而不是1的文本常量值 所以我只想使用内存分配的特性来度量int和short的大小,而不是sizeof函数。
感谢您的回答和评论,尽管它们不是我想要的。

为什么您认为上面的代码可以帮助您确定任何类型的大小?您可以使用sizeof表达式来确定类型的大小。printf%d\n,int-sizeofshort;sizeofvoid*可能不同于sizeofother_类型*。在现代系统中,它们与之相同,这是在地址空间有限的情况下最方便的方法;但这并不是一直都是这样。McMcNabb我觉得你总是在那里拓宽我对C++的了解。有时候很烦人。大多数时候,它是有教育意义的。您是否有对这一点的引用?在标准的[basic.component]中,指针类型的值表示是实现定义的。术语值表示在上一节中定义为保存T型值的一组位;当我们谈论指针时,指针是一组用来保存指针的位,而不是指向的东西。给出了两种情况,指向两种特定类型的指针必须具有相同的rep和对齐方式,但没有一个通用条款规定所有指针都具有相同的rep和对齐方式。@MattMcNabb我从您那里学到的另一件事。非常感谢。顺便说一句,我刚刚更新了我的答案以反映我的新理解。%d需要一个int参数;sizeof产生一个大小。将参数car设置为int或使用%zu(如果您的实现支持);Microsoft的可能不是。以下变量是哪个变量?这取决于编译器、编译器标志、确切的源代码以及编译时的确切情况,因此不稳定。而且,你不做C++中的地址运算,你做指针运算,意味着内置的指针类型自动缩放。
int a;
scanf("%d%d",&a,&a+1);
printf("%d",a+*(&a+1));
printf("size of short: %d\n", sizeof(short));
printf("size of pointr: %d\n", sizeof(short*));
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