【发布时间】:2012-07-20 07:40:52
【问题描述】:
遇到一个有趣的面试问题:
test 1:
printf("test %s\n", NULL);
printf("test %s\n", NULL);
prints:
test (null)
test (null)
test 2:
printf("%s\n", NULL);
printf("%s\n", NULL);
prints
Segmentation fault (core dumped)
虽然这可能在某些系统上运行良好,但至少我的系统抛出了分段错误。 这种行为的最佳解释是什么?上面的代码是 C 语言。
以下是我的 gcc 信息:
deep@deep:~$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
【问题讨论】:
-
在 VS2010 上都没有崩溃。它只是为空指针打印
(null)。 -
是的,正确的。答案可能在很大程度上是特定于架构的。
-
一开始我不知道你可以
printf一个空指针......我期待它们都崩溃。现在看看这是指定的、实现定义的、未定义的行为,还是只是编译器错误。 -
未定义的行为意味着它可能会崩溃,它可能看起来成功,它可能会擦除您的硬盘驱动器,或者它可能会在您的屏幕上显示阳光和小狗。你永远不知道。
-
根据 7.1.4:除非在随后的详细说明中另有明确说明,否则以下每个语句均适用: 如果函数的参数具有无效值(例如函数,或程序地址空间外的指针,或空指针,或指向不可修改存储的指针(当相应的参数不是 const 限定时)或具有变量的函数不期望的类型(提升后)参数数量,行为未定义。
标签: c linux language-lawyer compiler-bug