如果栈里没有1,能否这样理解:先在栈里开放一个区域存储a,然后在再开放一个区域存储1,然后让a指向1?这是对的么?如果是的,a怎么指向的1?非常感谢!

解决方案 »

  1.   

    int a = 1;
    在栈的数据区给a分配一个内存地址
    然后在a的内存地址保存一个1(二进制00000000 00000000 00000000 00000001)
      

  2.   


    我能这样理解你的意思么:a并不是存储在栈内,而是放在另外一个地方,这个地方是专门存储像a这样的内存地址索引。只有1放会在栈内开辟内存存储。我知道我已经钻牛角夹了,但连这个都不知道根本没办法继续学java。 
      

  3.   

    这个不存在指向不指向的问题,a的值就是1栈中存储a在内存中的地址a对应的内存地址中存1
      

  4.   


    差不多就是这个理解了,一个编译好的class,是找不到a的信息的,在运行过程中,跟它对应的是一个地址,在java里用索引表来管理这些地址,比如 a被编译为索引1,那么索引表的信息就是
    索引1 索引1对应的内存地址
    ...
    当遇到a=1指令的时候,因为a被编译索引1,所以到索引表找到索引1对应的地址,然后在该地址上把1保存
      

  5.   


    a的值(即1)肯定在栈里面,a不在栈里面,a在地址在内存的代码段里面,a只是为了方便记忆 1存放的地方,如果是汇编,简单的说直接就是: 0x0001 = 1。其实具体汇编的操作是给内存中压栈一个整型数字1 内存分布图
    地址从小到大。
    0x0001  代码段 函数指令 a我觉的在这里存放
             数据区 全局变量,静态变量     
    …… 常量区 字符
    堆内存 程序员自己使用的,new出来的
    0x1110 栈内存 程序编译是就已经分配好地址了1 应该在这里
    我觉得你好好看编译原理
      

  6.   

    a的值(即1)肯定在栈里面,a不在栈里面,a在地址在内存的代码段里面,a只是为了方便记忆 1存放的地方,如果是汇编,简单的说直接就是: 0x0001 = 1。其实具体汇编的操作是给内存中压栈一个整型数字1  内存分布图如下:地址从小到大。
    0x0001 1代码段     函数指令 a我觉的在这里存放 
            2 数据区    全局变量,静态变量   
    ……    3 常量区    字符
            4 堆内存    程序员自己使用的,new出来的
    0x1110 5 栈内存    程序编译是就已经分配好地址了1 应该在这里 
    我觉得你好好看编译原理
      

  7.   

    排版不好,重新发下这个内存分布图如下:地址从小到大。代码段地址最小
    1代码段 函数指令 a我觉的在这里存放  
    2 数据区 全局变量,静态变量   
    3 常量区 字符
    4 堆内存 程序员自己使用的,new出来的
    5 栈内存