我对C中自引用结构的大小有一些疑问。我运行了以下代码,它给了我 24
的输出#include<stdio.h>
int main() {
struct hello {
int a;
char ch[10];
struct hello *p;
} dhiraj;
printf("%d",sizeof(struct hello));
return 0;
}
接下来,我修改了ch的索引,并在下次运行时将其设为20,运行后输出 32
我注意到的另一个奇怪的行为是在执行以下代码后 -
#include<stdio.h>
int main() {
struct hello {
int a;
// int b; Statement 1
// int c; Statement 2
struct hello *p;
} dhiraj;
printf("%d",sizeof(struct hello));
return 0;
}
我的输出 16 。激活语句1后,输出仍然 16 ,但在激活语句1和语句2后,输出变为 24 。这里到底发生了什么?
答案 0 :(得分:2)
您遇到的是data structure padding。数据以字大小块的形式处理,在64位计算机上,这可能是8个字节。这意味着您的结构将被填充为8的倍数。
struct hello {
int a;
char ch[10];
struct hello *p;
}
假设您使用64位指针的64位机器,那就是4 + 10 + 8 = 22. 22不是8的倍数,所以sizeof(struct hello)
被填充到24位。更改它至ch[12]
,你仍然可以获得24.将其更改为ch[13]
,大小将跳至32。
这有点过于简单了,但你明白了。
答案 1 :(得分:1)
短版本:分配的需要以8个字节的块分配。
所以数学在64位架构上是这样的。 指针将是8个字节,因此大小为:struct hello * p;
int的大小将是4个字节,因为它是32位整数。
结构内容这两个都是12 - 但由于这个机器的字大小是64位编译器将分配一个完整的字数(每个8字节)..使16最小的选项 - 添加另一个整数( int a)如果空闲,因为它仍然可以适合16个字节。 但是第二个整数意味着您必须使用另一个单词来填充完整的有效负载。