您的位置:首页 > 其它

结构体造成的内存空洞

2016-11-20 20:57 627 查看
实际编程时,经常需要处理批量数据,对于同类型的数据,我们可以使用数组来保存,但是如果是对不同类型数据进行批量处理,这就需要结构体了;

结构体给我们变成带来了很多便利,但是它也有自身的缺陷:那就是容易造成内存空洞。

首先我们来看一下下面的程序:

#include <stdio.h>

struct node            //noid为结构体名
{
char ch1;

int num;

char ch2;
char ch3;
};

int main()
{
struct node N;

printf("sizeof(N) = %d\n", sizeof(N));

return 0;
}


 sizeof的功能是计算N的内存大小的,一般来说,很多人会认为输出结果是 1(char 型) + 4 (int型)+ 1 (char 型) + 1(char型) = 7;

但是实际结果是 12.

那么 12 是怎么来的呢?

首先我们要知道,在结构体分配空间时,如果结构体中出现4个字节及以上的变量时,给每个变量分配空间时都是按字对齐分配的(就是4个字节,4个字节。。。来分配),

如果结构体中没有出现4个字节以上变量,则按半字对齐,(2个字节,2个字节。。来分配)。

在本例中,因为出现了int 型的4个字节的变量 num,所以分配空间是按字对齐分配的,下面我们来阐述本例是怎么给结构体各个变量依次分配空间:

1. 给ch1分配空间,因为是字对齐分配,所以给了4个字节存放ch1,但是ch1是char型,只占用了1个字节,还有3个字节空着。

2.给num分配空间,因为之前分配的空间只剩3个字节未被占用,不能存放4个字节的int型数据,所以,又分配按字对齐分配4个字节给num,num占满了这4个字节;

3.给ch2分配空间,因为它上面的空间被num占满了,只能再按字对齐分配4个字节,存放ch2后还剩3个字节;

4。给ch3分配空间,因为上面还有3个字节的空间,可以存放完ch3,所以不需要再分配空间。

上面四个步骤总共分配了3次4个字节,所以占用了12字节。

通过这个例子可以看出,我们分配了12个字节给结构体,这12个字节中只有7个字节存放了数据。这就是内存空洞。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: