**
c语言定义结构体的时候内存空间是如何分配的
**
PS:(几句废话)学习刚刚接触结构体的时候发现这个东西真好用,不管什么,只要是能联系到一起,共属于一个东西的属性基本都可以写成一个结构体,后来慢慢知道了有一种东西叫做“对象”,也就是今后要学的C++和Java等语言要理解的,那么是不是c也可以面向对象呢?其实大家可以思考一下这个问题。
废话不多说,下面说正文
结构体虽然好用,但用多了就容易发现结构体也存在一些弊端,就是内存的对齐问题,有时候简简单单的几个长短不一的字符数组就可能发生越界访问的问题,令人困扰不已。
举个例子:
```c
#include <stdio.h>
typedef struct stu{
char name[6];
int a;
char num[7]
}STU;
int main()
{
STU p ;
printf("char %d int %d\n",sizeof(char),sizeof(int));
printf("STU %d\n",sizeof(STU));
printf("p.name %d p.num %d",sizeof(p.name) , sizeof(p.num));
return 0;
}
可以看出int,char分别占有4,1个字节,结构体却占了20个字节,明显和我们的想想不一样,多出了3个字节的内存。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
那么,为什么会发生这种情况呢?
在学习计算机组成原理的时候学过这么一个知识点,在存储器部分:为了便于硬件的实现,通常要求多字节数据在存储器中的存储方式能满足边界对准,个人猜测结构体分配内存发生这种内存字节对齐问题就与硬件的实现有关 实际上是由结构体内所占的内存最大的变量决定的;此外,还有一个可能的原因是为了内存存取方便,节约存取时间。
那么,该如何解决这种问题呢。
(1)、一个简单的方法就是将字符串长度都定义成8的倍数(结构体内存分配都是以8字节为基准的),可以很好的避免结构体内部的字符串访问越界的问题。
(2)、另一个办法可以调整结构体内部数据元素的顺序,因为结构体分配内存还和元素声明的顺序有关。一般可以采用将占内存大的放到前面,或者将占内存小的放在最前面,即采用按内存大小递减或者递增的顺序定义元素,两种方式均比杂乱无章的定义元素要节省内存空间。
(3)、当然,将上述两种方法结合起来更好。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
大家觉着文章有帮助的话可以点个赞呀。( ̄▽ ̄)*