我正在考虑 Java 和 C 如何管理范围内的变量。
在 java 中,每个迭代器,我创建一个新对象,然后打印它。结果表明每个迭代器都有一个新对象。
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
while (true) {
Ideone object = new Ideone();
System.out.println(object);
}
}
}
还有 C 中的范围变量。我做的和在 Java 中做的一样。每个迭代器我创建一个变量并打印它的地址。但结果让我感到困惑,因为它返回的是相同的地址,因为我认为每个迭代器都会在随机地址
创建一个新变量#include <stdio.h>
int main() {
while (1) {
int variable;
printf("%p\n", &variable);
}
}
谁能告诉我 Java 和 C 的底层是什么??为什么 C 不为其变量创建随机地址?
编辑 1:
我还有一个关于 C 语言动态内存管理的问题:
#include <stdio.h>
int main() {
while (1) {
int *variable = malloc(sizeof(int));
printf("%p\n", variable);
}
}
在这种情况下,它们在每个迭代器之后打印不同的地址。每个地址都比前一个地址大。
但是如果像这样释放内存,现在它会打印相同的地址
#include <stdio.h>
int main() {
while (1) {
int *variable = malloc(sizeof(int));
printf("%p\n", variable);
realloc(variable, 0);
}
}
C 内存管理不会为新变量生成随机地址吗?
最佳答案
在 Java 中,new Ideone()
对象的生命周期不受范围限制,您可以从函数中返回它。
在您的 C 代码中,int variable;
创建一个对象,当您到达定义它的范围的末尾时,该对象会自动销毁。
C 的许多实现使用堆栈来分配此类对象。以这种方式使用时,堆栈将始终为您提供相同的地址。
这种比较有点像苹果与橙子的比较。将 Java 的 new
与 C 的 malloc
进行比较会显示出类似的行为。
关于java - Java和C如何管理局部变量的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43938915/