我们知道局部变量在堆栈内存中有主要功能和所有其他功能。当我打印主要功能的地址,局部变量的地址和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;
}
}
}
答案 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