正常调用free()时,为什么会出现总线错误或分段错误?

时间:2010-04-18 15:03:05

标签: c memory-management pointers

我有一个非常简单的测试程序,在Solaris 5.8上运行:

#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()也会导致总线错误。有没有什么理由试图释放内存导致崩溃?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

getenv()返回的内存不是由malloc()分配的,因此不应该被free()释放。通常,不应该使用free()释放不属于malloc()系列的C标准库函数,或者实际上释放它们。

答案 2 :(得分:1)

  

指针指向的字符串   由此功能返回的不得   由程序修改。

这不是你的记忆。