今天在学习linux的platform总线时,设备对资源的描述用到了结构体数组,以前从没见过
如下
![](https://i-blog.csdnimg.cn/blog_migrate/d3d19b72c1ebb74d02b96e709d294122.png)
很明显用结构体数组主要是用来给一系列相同类型的结构体赋值,主要是来看内存分配问题
首先是结构体的内存分配,在这里重新总结一下
结构体对齐规则:
结构体的整体对齐要向结构体所有成员中最大对齐字节数或其整数倍对齐,或者说结构体的整体
长度要为其最大成员字节数的整数倍,如果不是整数倍要补齐。
注意:
不同的排放顺序,可能会导致结构体的整体长度不一样。
实例说明
eg1:
![](https://i-blog.csdnimg.cn/blog_migrate/319efe978a39a624ce471fae7b6a2adc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a3976223ee2f39b0afb6477f11b271bd.png)
首先是定义了字符型变量a,占一个地址,再定义整形变量b,b是4字节的对齐方式,所以隔出3个地址,从824开始占到827四个地址,double占8个地址,所以c占了828到82f。最后是d占4个地址
但结构体的长度应该为占空间成员的整数倍,所以后面补了4个·字节。
eg2:当我们把a数据占5个地址后,
![](https://i-blog.csdnimg.cn/blog_migrate/7f1a6bb7de7b5cac37a1f29837293300.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d4a1d091202418be0ad44b655b78ff9d.png)
此时,a占了5个字节,后面遇到int时,空出来的3个地址不够int型数据占,所以补了三个地址,b从48开始占地址,占了4个,再遇到double型时,空出的地址不够,所以c从50开始占地址,占8个,最后d占4个,补了4个。
eg3:在最后占位添加数据,结构体长度不变。
![](https://i-blog.csdnimg.cn/blog_migrate/5a3cad9e0978f845557cdb8df7e9819b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3ee176b379a9a73a9f214ec07941ca09.png)
总结:
结构体分配数据空间会根据占空间最大的成员来分割,当后面数据的长度小于前一个数据所剩的空间大小时,直接按数据类型对齐占位;大于时,就补齐前一个数据所剩的空间,从下一个整数位占位。最后一个数据占位后,不足最大数据的整数倍时也会占位到整数倍。
结构体数组
看了一些资料和写了几个示例程序,大概是明白了,结构体数组就是把一个结构体变量当作一个数组的成员进行存储。
![](https://i-blog.csdnimg.cn/blog_migrate/f82ec4d4c3f963fd9c2661b2d0f18c7a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f88b1c397a7770fea012027549e69752.png)
首先是结构体变量的赋值,和单独使用结构赋值没有任何区别,不同的是此时结构的名字是用数组进行修饰。除了我上面这种赋值方式,下面这种方式也是可以的,具体使用哪种看自己习惯。
![](https://i-blog.csdnimg.cn/blog_migrate/d3d19b72c1ebb74d02b96e709d294122.png)
数组名还是代表整个空间的的首地址,整体的存储空间还是连续的,结构体的数据对其方式还是没有改变。