我在编写字符串数组的初始化列表时不小心漏掉了一个冒号,然后发现 printf
可以成功打印一个无效的 (0x0
) 字符串。以下是我的 C 文件:
#include <stdio.h>
const char *names[3]=
{
"a",
"b" // missing colon here made names[1] == "bc"
"c"
};
int main(int argc, char **argv)
{
printf("name [2] = %s",names[2]);
return 0;
}
当我编译并运行它时,出现了
name [2] = (null)
的结果,这很“奇怪”,因为我认为直接崩溃应该更有意义,不是吗?我难以发现原因,因为我使用的一些字符串不是"b"
和"c"
,而是像null
、nothing
等单词。
我的问题是:(1)为什么没有发出警告?(2)为什么printf
有这种默认行为?
"%s"
相关联的参数必须是字符类型数组的初始元素的指针"。如果您的参数不符合要求,那么将导致未定义行为:可能出现预期和/或意外结果。 - pmgprintf
时,它是特定实现所选择的方式来避免出错(如果我没记错的话,glibc就是这样做的)。我相信它会检查指针,例如if (!ptr)
,如果测试结果为真,则输出"(null)"
。 - David C. Rankin