none
VC 2010编译 变量内存地址问题 RRS feed

  • 问题



  • 1楼


    vc 2010 为何int(包括char) 变量内存地址不是间隔的4字节,,而是12

    WIN7 *32    Microsoft Visual Studio 2010~~~~
    如下

    #include "stdafx.h"

    int main(int argc,char*argv[])
    {
       int i,j;
       //scanf_s("%d",&i);
      // scanf_s("%d",&j);        
       int k=i+j;
       printf("%d\n%d\n%d\n ",&i,&j,&k);------显示的十进制,,也是12!
       printf("%d",sizeof(i));---->这里显示的是4

       return 0;


    }
    +         &i        0x0024f8f0        int * -----   这里是
    +         &j        0x0024f8e4        int * -----    间隔为
    +         &k        0x0024f8d8        int *------     12!!!


    • 已移动 Sheng Jiang 蒋晟Moderator 2010年10月6日 15:25 (发件人:Visual Studio 相关讨论(Visual Studio 2010以前版本))
    2010年10月6日 12:48

答案

  • C++编译器没有义务按照一定的顺序或者间隔来分配局部变量

    比如编译器可以将变量优化到寄存器,这时候变量没有内存地址。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年10月6日 15:26
    版主

全部回复

  • C++编译器没有义务按照一定的顺序或者间隔来分配局部变量

    比如编译器可以将变量优化到寄存器,这时候变量没有内存地址。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年10月6日 15:26
    版主
  • 特殊编译器在debug模式下的内存越界保护。release下就不会有这种情况。并不是所有编译器都要如此分配内存。
    麻烦把正确答案设为解答。
    2010年10月7日 15:15
    版主
  • 这个会有固定间隔吗?编译器只是在内存空间内找了块合适的就给他们一个一个分配了吧。
    2010年10月8日 10:11
  • 你用atl+8反汇编一下就知道原因了。函数内部是利用栈分配的,肯定内存是连续的,不连续肯定有其他的变量或者对齐占了空间
    0xBAADF00D
    2010年10月8日 15:37
    版主
  • struct和class里面的成员才有固定的算法。变量的话debug和release会根据他们不同的特殊需要采用不同的方法。
    2010年10月12日 3:33
  • 因为debug要在变量之间插入一些东西来检查你是否有缓存溢出,所以不连续也是正常的,只不过至少不会太远。
    2010年10月12日 3:33