gpt4 book ai didi

c - 这是对该程序输出的正确解释吗?

转载 作者:太空狗 更新时间:2023-10-29 15:00:51 26 4
gpt4 key购买 nike

#include<stdio.h>

int main()
{
struct test
{
char c;
int y;
float r;
double d;
} t1;
printf("%d\n",sizeof(t1));
return 0;
}

输出:24 在我的 gcc 4.3.2 Ubuntu 12.04 上

输出:Ideone 上的 20 Link for Running Code

我的解释:我认为 24​​ 是正确的。如果我错了,请纠正我?

  1. 第一个 block 将由 Char 'c' 占用。 1 个字节为自己,后跟 3 个字节的填充。
  2. 第二 block 将由整数“y”占用。 (在这种情况下不需要填充,因为整数是 4 字节。所以它将完全填充 block )。
  3. 第三 block 将由 float 'r' 占用。 (不需要填充,因为 float 也是 4 个字节)。
  4. 现在将填充下一个 4 字节 block ,因为下一个是双字节。和存储地址必须是该数据类型大小的倍数。
  5. 接下来的 2 个 4 字节 block 将被 double 变量占用。

因此 Size = 1(char) + 3(在 Char 情况下填充) + 4(int) + 4(float) + 4(为 Double 填充) + 8(double) = 24

为清楚起见:

因为 Chunks 是在 4 字节的集合中。所以每个地址都是 4 的倍数。对于 double ,下一个地址必须是 1012。但它不是 8 的倍数。所以填充它!从 1016 开始 memory layout我的问题 - 24 是否正确,我的解释是否正确,或者我的解释是错误的,请解释一下?

最佳答案

从某种意义上说,您的解释是正确的,因为特定的编译器会为该结构输出具有特定布局的二进制文件。如果您正确预测了输出,那么您的预测显然对于您在这个特定时间的特定设置是正确的。

但结构的大小不是,无论如何,都是在 C 中严格定义的。在这个主题中唯一定义的是结构成员的顺序和第一个成员的偏移量。填充以及因此结构的总大小是未定义的,它留给编译器决定。显然,编译器填充结构的主要原因是通过根据各自的类型正确对齐成员来提高性能(正如您正确指出的那样)。但是(这在这里很重要)编译器会根据目标体系结构选择最有效的填充。例如,如果架构具有 128 位 int,您可以想象结构的大小会有多么不同。

因此,如果涉及到 C 语言的定义方面(或您所描述的以外的任何设置)您的预测将毫无根据。它自然会匹配一些设置,但只是偶然。

关于c - 这是对该程序输出的正确解释吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17218612/

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