Register__ 2022-02-06 13:53 采纳率: 89.5%
浏览 43
已结题

C/C++ 结构体打印结果不一样

如果用 printf 打印 直接打印结构体 ,我一直以为打印出来的就是第一个成员的内容 ( 排除虚表)
问题:(是32位,类型大小都一样,没有那个内存对齐什么的)

img


(图1)

(图1)看出 用printf打印 对象名 直接出 第一个成员 ,但是 如果这样打印 , 结果不一样 (图2)

img


(图2)

发现 打印 v1 依旧是 &val 地址 ,但是在第一条语句中 &val 是 m_age 的值(这里我多次试过不同的m_age值)
就是说偏移了4个字节 直接到了 m_age上 , 我知道 printf 的参数是从右往左算的 (应该是吧,我记得我学过汇编,有一课是看函数的堆栈图,参数都是从右往左 push 进去 的, 汇编就学了点皮毛 ,应该是这样,可是这对打印结果有什么影响呢?这里我就不明白了)

但是我换个 方式打印 如(图3)

img


(图3)

这个合乎我的意料(但不知道这样为什么就对了)

  • 写回答

2条回答 默认 最新

  • _GX_ 2022-02-06 15:26
    关注

    v1按值传入printf()函数,相当于把v1.m_ptr, v1.m_age分别压入栈,因此输出格式"%X %X"输出的就是v1.m_ptr, v1.m_age的值

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月6日
  • 已采纳回答 2月6日
  • 创建了问题 2月6日

悬赏问题

  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大