关于结构中变量的内存分配的问题(在 C 中)[重复]
Posted
技术标签:
【中文标题】关于结构中变量的内存分配的问题(在 C 中)[重复]【英文标题】:Question regarding memory allocation of variables in a structure (In C) [duplicate] 【发布时间】:2011-04-29 18:35:02 【问题描述】:可能重复:Why isn't sizeof for a struct equal to the sum of sizeof of each member?
#include <stdio.h>
int main()
struct word1
char a;
int b;
char c;
;
struct word2
char a;
char b;
int c;
;
printf("%d\t%d\n", sizeof(int), sizeof(char)); //Output : 4 1
printf("%d\t%d\n", sizeof(struct word1), sizeof(struct word2)); //Output: 12 8
return 0;
代码可在IDEONE获取。
为什么 struct 1 (word1) 的 size 大于 struct 2 (word2) 的 size?
这是编译器问题吗?
【问题讨论】:
不要使用 'void main()
' 并期望不会大喊大叫 - main()
的正确返回类型是 int
。
有一天有人会声称返回 void 而不是 int 会导致核熔毁或其他原因。
好的,下次我会处理这个的。
@Crashworks:也许,但不是我。这意味着没有可靠的值返回给环境,所以如果程序 A 依赖于程序 B 的退出状态,那么如果 B 没有返回值,A 将从 B 收到什么值是不确定的。现在,如果这些程序靠近核电站,人们会假设代码审查、测试和编码标准都确保不会发生灾难。如果初学者学会从 main() 中返回一个值,这有助于他们准备好在比课堂练习更苛刻的环境中工作。最终,他们应该阅读 C 标准,但还没有。
一定是 Stack Overflow 上重复最多的主题问题之一。
【参考方案1】:
int
可能有四字节对齐要求,因此在第一种情况下,char
两个元素都需要附加三个填充字节,但在第二种情况下,您只需要两个填充字节第二个char
元素(因为char
元素有一个字节对齐)。
word1
看起来像:
0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |10 |11
a | (padding) |b |c | (padding)
word2
看起来像:
0 |1 |2 |3 |4 |5 |6 |7
a |b |(padding)|c
【讨论】:
【参考方案2】:案例一:
0 1 2 3 4
+---------------------+
| a | Unused | 4 bytes
+---------------------+
0 1 2 3 4
+---------------------+
| b | 4 bytes
+---------------------+
0 1 2 3 4
+---------------------+
| c | Unused | 4 bytes
+---------------------+
总数:12
案例 2:
0 1 2 3 4
+---------------------+
| a | b | Unused | 4 bytes
+---------------------+
0 1 2 3 4
+---------------------+
| c | 4 bytes
+---------------------+
总数:8
P.S : Structure Padding 是实现定义的。
【讨论】:
以上是关于关于结构中变量的内存分配的问题(在 C 中)[重复]的主要内容,如果未能解决你的问题,请参考以下文章