c结构体赋值_C语言中结构体数组成员赋值时的内存拷贝过程

关于给结构体成员中的结构体数组赋值的问题

c语言源码:Line26-27

369ab7146e5d00f5363ae438010a9768.png

汇编指令:实质上是执行了从源内存拷贝值到寄存器再从寄存器到目的内存地址

e400e7041b0a0b026c8444f69ad84aeb.png

?疑问:为什么stu_t[0]的地址是0x3c,stu_t[1]的地址是0x34(小端)

如果使用memcpy函数呢?

将 Line26写为memcpy(stu_info_t.stu_t, &stu_fir, sizeof(stu));,汇编代码如下

67d5a7019614ec18ef2583d8c8ec7007.png

执行了相同的操作。

为了验证疑问,Line27改为memcpy(stu_info_t.stu_t+1, &stu_fir, sizeof(stu));

看是否正确赋值给stu_t[1]?

57023892f3694d1c951d4a97783fc9ad.png

正确赋值且汇编代码相同。打印下stu_info_t.stu[0]的地址和stu_inof_t.stu[1]的地址

2b71f02439997182c8e68bdefdf0afa9.png

确实是递增内存,所以汇编拷贝时,拷贝到sut_t[0]时有0x3c的偏移量,到stu_t[1]时只有0x34的偏移量。(为什么是从目的内存向后偏移来计算而不是向前偏移?:因为局部变量时存放在栈中(自底向上),栈指针总是指向栈的高地址,所以使用时需要计算从栈顶向下偏移的地址量)

结论:使用结构体初始化结构体数组时,无论是直接赋与左值还是memcpy函数,本质上都是执行了源内存到寄存器再到目的内存的操作。

下一篇:动态链接库相关笔记(持续更新)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值