为什么Clang支持取消引用未初始化的指针

时间:2017-07-04 02:01:02

标签: c pointers

我试图了解我对C编程的了解。让我们从CLASSICAL问题开始(取消引用未初始化的指针):

int main( void ) {
    char *p;
    *p = 'a';
    printf( "%c\n", *p );
    return 0;
}

这显然是错的!我知道。但是,当我在我的MacOS 10.12上使用LLVM Clang 8.1.0作为编译器执行此操作时,它不仅未能检测到未初始化的指针,而且还显示了字符' a'在屏幕上,好像什么都没有错。至少我期待像#34; Segmentation Fault"。

请按照您的想法,花点时间看看以下代码:

int main( void ) {
    int i;
    char **strPtr;
    char *string = "Hello, world!";

    *strPtr = string;

    printf( "%s", *strPtr );
    return 0;
}

这次,我使用GCC-4.8.5运行代码,该代码已成功检测到第一个代码中的分段错误。令我沮丧的是,字符串" Hello,world!"我运行代码后出现在屏幕上,好像没有任何问题。

我想知道,因为strPtr也是一个指针(虽然是一个指向指针的指针),通过解除引用并为strPtr赋值,不应该像我在第一个代码中那样提交相同的错误吗?

1 个答案:

答案 0 :(得分:3)

它没有支持它;只是编译器假定你知道自己在做什么。

只是取消引用未初始化指针的行为未定义

看似工作是未定义行为的表现。

记住古老的格言:C让你有能力用脚射击自己。