在空指针上调用free()时发生分段错误

leo*_*xyz 1 c free gcc segmentation-fault

我在下面的代码中观察到一个非常奇怪的行为.
按原样编译,everythig按预期工作:输出为"这是一个示例程序.".

如果我取消注释所有注释行,我在第一次调用free()时会出现分段错误.

理论上评论不应该改变行为,对吧?这里有什么问题?

PS:我在Arch Linux上使用gcc(GCC)4.9.2 20141224(预发行版)

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

int main () {
        char *welcome;
//        int max;
//        int x;
        free(welcome);
        welcome = strdup("This will be discarded.");
        free(welcome);
        welcome = strdup("This is a sample program.\n");
        printf ("%s\n", welcome);
//        max = 80;
//        x = 1;
//        while ( x <= max ) {
//                int y;
//                y = 1 ;
//                while ( y <= x ) {
//                        printf ( "#" ) ;
//                        y = y + 1 ;
//                }
//                printf ( "\n" ) ;
//                x = x + 1 ;
//        }
        return 1 ;
} 
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 6

理论上评论不应该改变行为,对吧?这里有什么问题?

问题是它不是一个NULL指针,因为它尚未初始化,因此调用free()试图在随机地址解除分配:

char *welcome;
//        int max;
//        int x;
free(welcome);
Run Code Online (Sandbox Code Playgroud)

这是未定义的行为,来自free():

如果ptr与之前由malloc(),calloc(),realloc()或aligned_alloc()返回的指针不匹配,则行为未定义.


wol*_*k88 5

注释不会更改任何明确定义的代码段的行为.但是,free未初始化的指针是未定义的行为.当编译器看到未定义的行为时,可以随意做任何事情; 是否是一个段错误或(更加阴险)似乎工作正常.