关于给结构体成员中的结构体数组赋值的问题
c语言源码:Line26-27
汇编指令:实质上是执行了从源内存拷贝值到寄存器再从寄存器到目的内存地址
?疑问:为什么stu_t[0]的地址是0x3c,stu_t[1]的地址是0x34(小端)
如果使用memcpy函数呢?
将 Line26写为memcpy(stu_info_t.stu_t, &stu_fir, sizeof(stu));
,汇编代码如下
执行了相同的操作。
为了验证疑问,Line27改为memcpy(stu_info_t.stu_t+1, &stu_fir, sizeof(stu));
看是否正确赋值给stu_t[1]?
正确赋值且汇编代码相同。打印下stu_info_t.stu[0]的地址和stu_inof_t.stu[1]的地址
确实是递增内存,所以汇编拷贝时,拷贝到sut_t[0]时有0x3c的偏移量,到stu_t[1]时只有0x34的偏移量。(为什么是从目的内存向后偏移来计算而不是向前偏移?:因为局部变量时存放在栈中(自底向上),栈指针总是指向栈的高地址,所以使用时需要计算从栈顶向下偏移的地址量)
结论:使用结构体初始化结构体数组时,无论是直接赋与左值还是memcpy函数,本质上都是执行了源内存到寄存器再到目的内存的操作。
下一篇:动态链接库相关笔记(持续更新)