如何知道C函数是否正常工作?

时间:2011-03-17 02:16:38

标签: c memory

我看到以下代码的结果存在一些差异:

#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。

问候。

3 个答案:

答案 0 :(得分:8)

在释放指针后使用指针会导致未定义的行为。

这意味着程序可能会打印垃圾,打印字符串以前的内容,擦除硬盘,或让猴子从底部飞出,仍然符合C标准。

无法查看指针,并且知道何时释放内存&#34;。作为程序员,你可以跟踪它。

答案 1 :(得分:5)

如果调用free(),则该函数返回时将释放内存。这并不意味着内存会立即被覆盖,但使用任何你称之为free()的指针仍然是不安全的。

一旦释放了指针变量,总是将nil分配给指针变量是个好主意。这样,你知道非零指针是安全的。

答案 2 :(得分:3)

简单的ansewr:你无法检查指针是否已经在C中被释放。不同的行为可能是由于不同的编译器,因为在释放它之后使用指针是未定义的,你可以获得各种行为(包括SEGFAULT)和程序终止)。

如果你想检查你是否使用免费财产而你的程序没有内存泄漏,那就使用像Valgrind这样的工具。