我正在考虑Java和C如何管理范围内的变量.
在java中,每个迭代器,我创建一个新对象,然后打印它.结果说每个迭代器我有一个新的Object.
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
while (true) {
Ideone object = new Ideone();
System.out.println(object);
}
}
}
Run Code Online (Sandbox Code Playgroud)
C中的范围变量.我和Java一样.每个迭代器我创建一个变量并打印其地址.但结果让我感到困惑,因为它返回相同的地址,因为我认为每个迭代器都会在随机地址创建一个新变量
#include <stdio.h>
int main() {
while (1) {
int variable;
printf("%p\n", &variable);
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我Java和C的内幕是什么?为什么C不为它的变量创建随机地址?
编辑1:
我有另一个关于C中动态内存管理的问题,如下所示:
#include <stdio.h>
int main() {
while (1) {
int *variable = malloc(sizeof(int));
printf("%p\n", variable);
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它们在每个迭代器之后打印不同的地址.并且每个地址都比以前的常量大小多.
但如果释放这样的内存,现在它打印相同的地址
#include <stdio.h>
int main() {
while (1) {
int *variable = malloc(sizeof(int));
printf("%p\n", variable);
realloc(variable, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
C内存管理是否不为新变量生成随机地址?
在Java中,new Ideone()对象生存期未绑定到范围,您可以从函数返回它.
在C代码中,int variable;创建一个在到达定义范围末尾时自动销毁的对象.
C的许多实现使用堆栈来分配这样的对象.使用这种方式时,堆栈总是会给你相同的地址.
这种比较有点像苹果与橘子.将Java new与C 进行比较malloc会显示出类似的行为.