为什么我在第一个代码中出现分段错误,而在第二个代码中却没有
why do i get segmentation fault in 1st code but not in 2nd code?
我已经声明了一个包含 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
相关文章:
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- 等待整个 omp 块完成,然后再调用第二个函数
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- 为什么第二个代码给出了预期的结果,而第一个代码却没有?
- 为什么第一个代码块产生垃圾值,而第二个代码块将类成员的值相加?
- 为什么我的代码没有对数组中第二个索引上的数据进行排序?
- 为什么第二个代码有效而第一个代码无效?
- 代码未C++打印第二个字符数组
- exc_bad_access(代码= 1,地址= 0x68)在第二个读取方法中
- 如何在我的代码中修复无穷循环?我认为它跳过了第二个CIN,因此它一直在循环
- 当执行此代码中的第二个语句时,内部会发生什么
- 这段代码出了什么问题?它在第二个 cin 可以执行之前终止
- 两个GCC编译了相同的输入,生成了两个不同的代码(第二个错误)
- §7.1.6.3/1 (C++14) 不接受下面第二个代码段中的构造。这是为什么呢?
- 为什么我在第一个代码中出现分段错误,而在第二个代码中却没有
- 求和的阶乘-请求第二个代码
- 我在 c++ 代码的这一部分中找不到第二个常量实用程序,有人可以解释一下吗?
- 我不明白为什么编译代码片段的第二个版本。AFAIK 它不应该,因为 §10.3/2
- 当条件满足时,此代码不会切换到第二个while代码,如何解决此问题?
- 什么可能导致第一个代码片段的输出不同于第二个和第三个