#include <stdio.h>
#include <stdlib.h>
#define N 50
int main(void) {
int *pi;
pi = (int *)malloc(N * sizeof(int));
if (pi == NULL) {
printf("Out of memory!\n");
exit(1);
}
for (int i = 0; i < N; i++) {
*(pi + i) = 100;
}
free(pi);
pi[10] = 200;
printf("%d\n", pi[10]); // 输出 200
return 0;
}
执行 free(pi)
了,没道理 pi
还能访问。我看了下 c 标准,发现有这么一句话:
The behavior is undefined if after free() returns, an access is made through the pointer ptr (unless another allocation function happened to result in a pointer value equal to ptr)
这到底释放了内存没有?我是这么猜想的,这块内存其实回归了内存池,如果有其他的内存分配,将有可能复用这free
过的内存块。先前代码输出的200
, 其实等同于垃圾值,就像声明了一个int i
但未初始化而直接访问i
将会得到上次使用过i
内存的垃圾值。
不知我理解是否正确?
编译器版本如下:
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
本人初学 C,望指点!多谢多谢!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.