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



我试图了解我的C编程知识发生了什么。让我们从一个经典问题开始(取消引用未初始化的指针(:

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

这显然是错误的!我知道。但是,当我在MacOS 10.12上运行它并使用LLVM Clang 8.1.0作为编译器实现时,它不仅无法检测到未初始化的指针,而且还在屏幕上显示字符"a",好像没有错。至少我期待类似"分段错误"的东西。

请保持您的想法并耐心等待我查看以下代码:

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 赋值,我不应该犯与我在第一代码中所做的相同的错误吗?

它不支持它;只是编译器假设你知道你在做什么。

只是取消引用未内部指针的行为是未定义的

它似乎有效,是这种未定义行为的表现。

记住一句古老的格言:C让你有能力搬起石头砸自己的脚。

最新更新