c中的局部变量似乎靠近堆栈内存

时间:2016-10-18 13:04:47

标签: c memory stack heap

我们知道局部变量在堆栈内存中有主要功能和所有其他功能。当我打印主要功能的地址,局部变量的地址和malloc的地址时,似乎局部变量更接近到malloc地址,而不是主要功能地址。为什么? 代码:

public static void adicionarAmizade() {
    Scanner cu = new Scanner(System.in);
    System.out.println("Introduza o nome dos utilizadores!");
    System.out.println("\n1º:");
    String amigo1 = cu.next();
    System.out.println("\n2º:");
    String amigo2 = cu.next();

    for (Utilizador u : listaUtilizadores) {
        if ((u.getNome()).equals(amigo1)) {
            u.getAmigos().add(amigo2);
            System.out.println("Adicionou");
            System.out.println(u.toString());
            break;
        }
    }

    for (Utilizador u : listaUtilizadores) {
        if ((u.getNome()).equals(amigo2)) {
            u.getAmigos().add(amigo1);
            System.out.println("Adicionou");
            System.out.println(u.toString());
            break;
        }
    }
}

3 个答案:

答案 0 :(得分:2)

堆栈,代码和数据的确切布局完全取决于编译器。

这是实现定义的行为,因此它可能因编译器而异。

答案 1 :(得分:1)

auto个变量不必在使用它们的代码附近实例化。鉴于C没有绑定检查数组访问,这是一件好事,否则你可以使用缓冲区溢出来直接修补二进制代码。

以下是程序通常(尽管并不总是)在(虚拟)内存中布局的方式:

              +------------------------+ 
high address  | Command line arguments |   
              | and environment vars   |  
              +------------------------+
              |         stack          |
              | - - - - - - - - - - -  |
              |           |            |
              |           V            |
              |                        |
              |           ^            |
              |           |            |
              | - - - - - - - - - - -  |
              |          heap          |
              +------------------------+
              |    global and read-    |
              |       only data        |
              +------------------------+
              |     program text       |
  low address |    (machine code)      |
              +------------------------+   

详细信息因实现而异,但大局很常见。机器代码与数据隔离,全局和只读数据与堆栈和堆等分离。

答案 2 :(得分:0)

没有。与局部变量和"全局变量"。

相比,函数驻留在不同的内存中

对于特定的流程实例,它们的虚拟地址必须完全不同,以保持不同的段不重叠地址。

我认为它足够远以容纳你的筹码。

gps@gps-HP-ProBook-4540s:~/temp/weirdtest$ ./weirdtest 
Adress of main fuction: 4195709
Adress of a global variable(g): 6295628
Adress of a local variable(l): 29174716
malloc: 17440784