我看到以下代码的结果存在一些差异:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
int main(void)
{
char* ptr;
ptr = (char*)malloc(sizeof(char) * 12);
strcpy(ptr, "Hello World");
printf("%s\n", ptr);
printf("FREEING ?\n");
free(ptr);
printf("%s\n", ptr);
}
让我解释一下:
在第三次调用printf时,取决于操作系统,我获得了不同的结果,在Windows中使用了gargabge caracters,在Linux和Unix系统中没有任何内容打印出“Hello World”。
有没有办法检查指针的状态,知道何时释放内存?
我认为这种印刷机制一直不可信任。
Thnaks。
问候。
答案 0 :(得分:8)
在释放指针后使用指针会导致未定义的行为。
这意味着程序可能会打印垃圾,打印字符串以前的内容,擦除硬盘,或让猴子从底部飞出,仍然符合C标准。
无法查看指针,并且知道何时释放内存&#34;。作为程序员,你可以跟踪它。
答案 1 :(得分:5)
如果调用free(),则该函数返回时将释放内存。这并不意味着内存会立即被覆盖,但使用任何你称之为free()的指针仍然是不安全的。
一旦释放了指针变量,总是将nil分配给指针变量是个好主意。这样,你知道非零指针是安全的。
答案 2 :(得分:3)
简单的ansewr:你无法检查指针是否已经在C中被释放。不同的行为可能是由于不同的编译器,因为在释放它之后使用指针是未定义的,你可以获得各种行为(包括SEGFAULT)和程序终止)。
如果你想检查你是否使用免费财产而你的程序没有内存泄漏,那就使用像Valgrind这样的工具。