我无法理解以下程序输出的原因
#include <stdio.h>
#include <stdlib.h>
int main(){
int* ip = (int*)malloc(100*sizeof(int));
if (ip){
int i;
for (i=0; i < 100; i++)
ip[i] = i*i;
}
free(ip);
int* ip2 = (int*)malloc(10*sizeof(int));
printf("%dn", ip[5]);
printf("%dn", ip2[5]);
ip[5] = 10;
printf("%dn", ip2[5]);
return 0;
}
输出显示ip&ip2将在堆中具有相同的引用。当我们在(ip2(中分配一个100 int时,它是如何为ip1返回相同的引用的。它是malloc函数的一个特性吗?我知道malloc就像"新"一样工作,对吧?如果是,那么它应该返回一些随机引用,对吧?
所有输出都是未定义的行为,因此它们不表示任何东西:
printf("%dn", ip[5]); // ip was freed, so the memory it points to may not be accessed
printf("%dn", ip2[5]); // reading uninitialized memory
ip[5] = 10; // writing to freed memory
printf("%dn", ip2[5]); // still reading uninitialized memory
一般来说,ip2
完全有可能获得与ip
相同的地址。但您并没有在代码中测试这一点。你可以这样做,例如:
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ip = (int*)malloc(100 * sizeof(int));
printf("%pn", ip);
free(ip);
int* ip2 = (int*)malloc(100 * sizeof(int));
printf("%pn", ip2);
free(ip2);
}
当我运行它时,我确实会得到两次相同的地址(但不能保证会发生这种情况(。
我真的不明白你的问题是什么。
这完全取决于库,它在库中分配返回给您的内存。特别是,它可以使用也可以不使用最近释放的内存块,只要它仍然是空闲的。
你的第一个malloc()
保留了一些内存,你写进去,然后释放它。
你的第二个malloc()
保留了一些内存,你从中读取,然后释放它。
你在第二步读到的内容完全是任意的,只是巧合,就像你在第一步写的一样。
您的代码还显示了未定义的行为,因为在free(it)
之后不允许访问ip[5]
。
这是一种不应该依赖的未定义行为。当你通常从页面内存中分配内存时,当你释放内存时,它不会立即释放给操作系统,当你再次尝试分配时,很可能会得到缓存中的热内存。典型的操作系统内存单元在下一次迭代中以LIFO方式从相同的内存释放块中分配相同的大小。