为什么我在第一个代码中出现分段错误,而在第二个代码中却没有

why do i get segmentation fault in 1st code but not in 2nd code?

本文关键字:代码 第二个 第一个 为什么 分段 错误      更新时间:2023-10-16

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

hi
hello
how 
segmentation fault

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

hihellohow(null)...(7 times).

有人可以解释一下吗?


代码 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("%sn", a[i]);
}

代码 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]);
}

正如你自己所说,你不会初始化你的数组元素超过第三个,所以它们会自动初始化为空指针。尝试打印这些空指针是未定义的行为,因此任何事情都可能发生(包括第一个示例中的段错误,或第二个示例中的段错误)。

在这两种情况下,你的代码都是错误的,试图解释为什么随机的事情(再次,段错误或看起来有效)发生是没有意义的。

实际上,它可能来自您的编译器。如果您使用 GCC,此页面将说明printf("%sn", s)已优化为puts(s)。该页面显示了 2004 年的错误报告,但我可以在 Windows 下使用 GCC-4.7.2 重现该错误。虽然printf对空指针有防范,但puts似乎没有,因此根据换行符的不同行为。

但是,正如 syam 已经说过的,将空指针作为字符串提供不是标准的,可能会导致任何事情发生。在这里,GCC是友好的,打印(null)而不是简单地崩溃。

这两种情况都是不正确的,它们试图打印空指针的内容,这没有任何意义。您正在调用可能发生任何事情的未定义行为。

C 标准保证行char *a[10] = {"hi", "hello", "how"};按以下方式初始化:

a[0] -> "hi"
a[1] -> "hello"
a[2] -> "how"
a[3] -> NULL
...
a[9] -> NULL
相关文章: