2010-04-18 49 views
1

我有一个非常简单的测试程序,在Solaris上运行的5.8:当通常调用free()时,为什么会出现总线错误或分段错误?

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    char *paths; 
    paths = getenv("PATH"); 
    printf("Paths: %s\n", paths); 

    free(paths); // this causes a bus error 
    return 0; 
} 

如果我没有在最后调用free(),它显示消息罚款和退出。如果我包含free()调用,它会因总线错误而崩溃。在其他程序中,我还有其他呼叫free(),也导致分段错误。

即使我自己为*paths分配内存,free()也会导致总线错误。试图释放内存导致崩溃有什么原因吗?

+0

您需要张贴代码来说明您在上一段中提到的问题。 – 2010-04-18 15:17:36

+0

你只能在使用malloc,calloc,realloc获得的内存上调用free。一些函数也会返回应该被释放的数据,比如strdup。但是getenv不会分配任何数据以供调用者使用。 http://www.manpagez.com/man/3/getenv/ – Ernelli 2010-04-18 15:19:12

回答

5

因为你不应该freegetenv()返回的值(这是一个静态变量)。

+1

不要释放它,除非你知道它来自哪里! – 2010-04-18 15:06:21

+0

所以,即使我提前分配内存,一些功能只是重写,我不应该触摸它? – chucknelson 2010-04-18 15:17:36

+0

@chuck:像'char * paths = malloc(123); paths = getenv(“PATH”);'?指向malloc-ed内存的指针将被覆盖,所以它只会被泄漏。 – kennytm 2010-04-18 15:22:39

1

由getenv()返回的内存不是由malloc()分配的,因此不应该由free()释放。一般来说,不属于malloc()系列的C标准库函数都不应该使用free()来释放,或者实际上完全释放。

1

该函数返回的指针 指向的字符串不应该是由程序修改的 。

这不是你的记忆,免费。

相关问题