我试图了解我对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赋值,不应该像我在第一个代码中那样提交相同的错误吗?
答案 0 :(得分:3)
它没有支持它;只是编译器假定你知道自己在做什么。
只是取消引用未初始化指针的行为未定义。
看似工作是未定义行为的表现。
记住古老的格言:C让你有能力用脚射击自己。