为什么我在第一个代码中得到分段错误而在第二个代码中没有?

-1 c c++ pointers newline segmentation-fault

我已经声明了一个包含10个指向字符数组的数组.在10个我初始化时只有3个.当我使用%s以下内容打印数组时,\n它给出如下输出:

hi
hello
how 
segmentation fault
Run Code Online (Sandbox Code Playgroud)

但如果我不使用\n那么它给出输出如下:

hihellohow(null)...(7 times).
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?


代码1

#include <stdio.h>

void main()
{
    char *a[10] = {"hi", "hello", "how"};
    int i = 0, j = 0;

    a[0] = "hey";
    for (i = 0;i < 10; i++)
        printf("%s\n", a[i]);
}
Run Code Online (Sandbox Code Playgroud)

代码2

#include <stdio.h>

void main()
{
    char *a[10] = {"hi", "hello", "how"};
    int i = 0, j = 0;

    a[0] = "hey";
    for (i = 0;i < 10; i++)
        printf("%s", a[i]);
}
Run Code Online (Sandbox Code Playgroud)

sya*_*yam 5

正如您自己所说,您不会将数组元素初始化超过第三个,因此它们会自动初始化为空指针.尝试打印这些空指针是Undefined Behavior,因此可能发生任何事情(包括第一个示例中的段错误,或者看起来像第二个示例中那样工作).

在这两种情况下,您的代码都是错误的,尝试解释为什么会发生随机事件(再次,段错误或似乎工作)是没有意义的.

  • 数组元素已初始化.它们恰好被初始化为NULL,而`printf("%s",NULL)`是未定义的行为. (2认同)