小弟对结构体指针和内存分配的理解,恳请大神指教

2019-07-21 00:50发布

先上代码,使用的是原子stm32f1系列开发板,开发环境是MDK4.7a;
[mw_shl_code=c,true]struct A { char a; char b; char c; char d; char e; char f; char g; char h; }; struct B  { int a; int b; }; struct C { char a; int  b; }; __packed struct D { char a; int b; }; int main() { struct A temp_A={1,2,3,4,5,6,7,8,}; struct B temp_B={10,20}; struct A *p_A=&temp_A; struct B *p_B=&temp_B; int m = 0; int i = 0; int j = 0; int k = 0; int l = 0; i = sizeof(struct A); j = sizeof(struct B); k = sizeof(struct C); l = sizeof(struct D); m=((struct B *)p_A)->a; } [/mw_shl_code]
1>先说内存分配方面:
问题1:例如struct C,它的2个成员都是按照"字"来进行分配内存,所以大小是8字节
         而在struct D,因为使用了__packed,结果前者使用了"字节"进行分配,后者使用"字"进行分配.
        小弟的疑问是:针对struct A成员全是char类型,为什么全部按照"字节"进行分配(我也没有使用__packed),恳请大神指教~~~
2>结构体指针强制转换
看网上的网友说,指针强制转换,它的转换结果是"临时性的",也就说强制转换的结果只是临时起作用,并没有改变变量的本身类型属性.
如图,m的取值是04030201,这个小弟理解有问题
小弟分析如下:因为temp_A和temp_B是局部变量,是存储在堆栈中的,而堆栈的增长方向是高地址->低地址.
那么struct A成员在内存中的存储也应该是高地址->低地址
高地址
01
02
03
04
05
06
07
08
低地址
因为stm32采用的是小端模式,所以m的值应该是01020304啊?恳请大神指教~~~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
ianhom
1楼-- · 2019-07-21 05:31
 精彩回答 2  元偷偷看……
liuchang
2楼-- · 2019-07-21 05:45
恳请路过的大神指教下,不胜感激~~~
ianhom
3楼-- · 2019-07-21 08:36
问题2:
我理解单个数据存放的顺序和栈增长的方向是不相关的,应该只和大小端有关系。
你可以看一下0x200003Ec是不是0x01,而0x200003ed是0x02,在栈中的模型应该是这样的
低地址
0x200003EC     01
0x200003ED     02
0x200003EE     03
0x200003EF     04
0x200003F0     05
0x200003F1     06
0x200003F2     07
0x200003F3     08
高地址

这样小端模式就是地位在低地址,高位在高地址,0x200003EC到0x200003EF这段数据按照int来解读,那就是0x04030201
liuchang
4楼-- · 2019-07-21 09:47
回复【3楼】ianhom:
---------------------------------
一直蒙受大神教诲,小弟铭记于心~~~

一周热门 更多>