A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 墨琰 中级黑马   /  2015-8-13 23:05  /  645 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

结构体指针,结构体数组的使用方式

点评

不够详细呀  发表于 2015-8-14 09:38

8 个回复

倒序浏览
这个问题有点笼统呀!
回复 使用道具 举报
新生heima 发表于 2015-8-13 23:16
这个问题有点笼统呀!

那就说说内存对齐吧
回复 使用道具 举报
比如说
shar a;
short b;
int c;
应该是8个字节,先看最大int字节是4,处理到char的时候就给了4个字节,char占一个字节,short占了两个字节,现在是三个字节,空出了一个字节。因为int是四个字节,放不进去,就得重新调用4个字节。所以一共用了8个字节。
不知道是不是问的这个问题。
回复 使用道具 举报
学习了!谢谢分享
回复 使用道具 举报
内存对齐么,就那么一回事
回复 使用道具 举报
墨琰 发表于 2015-8-13 23:24
那就说说内存对齐吧

说下我的一个理解吧,仅供参考。
在计算机为结构体分配内存的时候,会选择一个模数(各种使用到的单个变量数据类型中占内存的最大值),这个就是分配内存的基数(内存的大小会是这个模数的整数倍,也就是说,要不就不分配内存,其他的变量挤一挤,要分配就分配一个模数大小的空间)。
确定这个模数之后,按照结构体成员的定义顺序 开始依次分配内存。(这些内容在视频,第12天18,中都有讲到)
对于视频中出现的问题的理解
对于结构体
struct A{
short  a;//2
float   c;//4
char   b;//1
double d;//8
};//占24字节

struct  B{
short  a;//2
char   b;//1
float   c;//4
double d;//8
};//占16字节
我认为计算机在确定大的模数的时候,对于小于模数的数据中又会分配一个小的模数,也就是说,在这里大模是8,小模是4,往下是2和1,对于structA ,模数8,所以先分配8字节,8字节内模数是4,开始分配short,2字节没问题,但是当分配float时,就需要分配到后4个字节中了(前4个字节因此浪费2字节),这样8字节占满,再分配char类型时,会再分配8字节,浪费7个,然后再分配8字节放double。也就是说每个数据类型分配时{只会分在以自身为模的地址中},Int和float只会分配的4的倍数的地址中,short只会分配的2的倍数的地址中,char分配在1的倍数的地址中(所有地址都是),double分配在8的倍数地址中。
F:\结构体A.png
对于structB就简单了,它的存储是第一个8字节(2字节short,1字节char,空1字节,4字节float),第二个8字节(8字节的double)
回复 使用道具 举报
我用qq简单画了个图,不过不知道怎么上传{:2_30:},希望文字你能看懂我说的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马