先上代码,使用的是原子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啊?恳请大神指教~~~
我理解单个数据存放的顺序和栈增长的方向是不相关的,应该只和大小端有关系。
你可以看一下0x200003Ec是不是0x01,而0x200003ed是0x02,在栈中的模型应该是这样的
低地址
0x200003EC 01
0x200003ED 02
0x200003EE 03
0x200003EF 04
0x200003F0 05
0x200003F1 06
0x200003F2 07
0x200003F3 08
高地址
这样小端模式就是地位在低地址,高位在高地址,0x200003EC到0x200003EF这段数据按照int来解读,那就是0x04030201
---------------------------------
一直蒙受大神教诲,小弟铭记于心~~~
一周热门 更多>