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

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啊?恳请大神指教~~~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。