V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
8e47e42
V2EX  ›  问与答

C 语言下(x86-64),同个函数下的变量可能会不连续吗?

  •  
  •   8e47e42 · 2020-04-05 17:20:45 +08:00 · 1301 次点击
    这是一个创建于 1692 天前的主题,其中的信息可能已经有所发展或是发生改变。

    遇到一个很古怪的问题: 例子:

    {
    ... //一些其他代码
    	int apple = 1; //Addr: a
    	int* apple_ptr = &apple ; //Addr: 预计=a-8,实际=a-12
    	int** apple_ptr_ptr = &apple_ptr; //Addr: 预计=a-16,实际=a-24
    }
    

    所以地址实际和预期之间的差距一般是什么原因造成的呢?

    6 条回复    2020-04-05 19:33:35 +08:00
    FujiZ
        1
    FujiZ  
       2020-04-05 17:25:15 +08:00 via Android   ❤️ 1
    需要考虑 padding
    Mohanson
        2
    Mohanson  
       2020-04-05 17:31:03 +08:00 via Android   ❤️ 1
    内存对齐的缘故?把 apple 改成 usize64 应该能得到你想要的结果,猜的
    lance6716
        3
    lance6716  
       2020-04-05 17:34:57 +08:00 via Android
    gdb 看看不就不用猜了吗
    unixeno
        4
    unixeno  
       2020-04-05 19:18:25 +08:00 via Android   ❤️ 1
    这个完全是编译器实现的行为
    你用不同的优化等级编译出来的结果可能都不同
    msg7086
        5
    msg7086  
       2020-04-05 19:32:35 +08:00 via Android   ❤️ 1
    为啥能预计?
    内存变量分配也不是写在规范里的呀。
    对齐,插调试信息,优化,都可能造成变量不相邻。
    tairan2006
        6
    tairan2006  
       2020-04-05 19:33:35 +08:00   ❤️ 1
    这里完全无法预期啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1659 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 16:52 · PVG 00:52 · LAX 08:52 · JFK 11:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.