关于结构中变量的内存分配的问题(在 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 中)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

堆栈和堆内存的大小[重复]

c/c++关于内存分配的知识(非常详细的比较,且VirtualAlloc分配内直接在进程的地址空间中保留一快内存)

C ++结构与类在内存方面[重复]

c语言中,系统为结构类型变量所分配的内存空间大小如何确定?

关于堆栈的讲解

关于C语言的 变量 地址 和 值