打印无效的C字符串成功

Ore*_*lom 4 c string null printf

在编写一些字符串数组的初始化列表时,我不小心错过了一个冒号,这使我观察到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;
}
Run Code Online (Sandbox Code Playgroud)

当我编译并执行它时,我得到的name [2] = (null)是“怪异的”,因为我认为仅仅崩溃应用程序才有意义,不是吗?我很难找到它的原因是因为我使用的某些字符串不是"b""c"而是诸如的单词nullnothing等等。 我的问题是:(1)为什么没有发出警告?(2)printf这种默认行为为何产生?

Adr*_*ica 6

这里的问题是初始化程序中的字符串连接!在代码中:

const char *names[3]=
{
    "a",
    "b" // missing colon here made names[1] == "bc"
    "c"
};
Run Code Online (Sandbox Code Playgroud)

文字"b""c"将被串联为一个值,"bc"因此,names[]数组的第三个元素将被初始化为零(空指针)。

没有警告,因为这样的字符串初始化是完全合法的C代码。

您的代码实际上是:

const char *names[3]=
{
    "a",
    "bc"
};
Run Code Online (Sandbox Code Playgroud)

依次与以下内容相同:

const char *names[3]=
{
    "a",
    "bc",
    NULL
};
Run Code Online (Sandbox Code Playgroud)

此外,如注释(pmgDavid C. Rankin)中所述,printf("%s", x)"when x是空指针的行为未定义的行为。正如Aconcagua所指出的那样,许多(或大多数)编译器将按照您的方式进行,并打印{null}或类似的东西。但是某些系统可能会崩溃。