当我尝试运行以下代码时:
#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]);
}
它给了我输出:
heyhellohow(null)(null)(null)(null)(null)(null)(null)
当我在printf语句中插入'\ n'时:
#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]);
}
它给了我以下输出:
hey
hello
how
Segmentation fault
我尝试阅读在线资料,我发现这是因为格式说明符并且编译器自动将 printf 转换为 puts 并且 puts 不承认“%s \ n”,但我仍然无法理解。任何人都可以用简单的方式解释这一点。
答案 0 :(得分:7)
在%s
中传递prinf()
格式说明符的空指针是未定义的行为。在这种情况下,运行时试图很好并且为这种情况显示“(null)”。在另一种情况下,未定义的行为是崩溃。
产生差异的一个可能原因是编译器工具链有时会将printf("%s\n", xxx)
转换为等效的puts(xxx)
(GCC在许多情况下肯定会这样做)。我猜puts()
对你的空指针不太好。
就个人而言,当"%s"
将空指针显示为“(null)”时,我喜欢它 - 在添加一些快速调试日志时,它会更方便一些。但是,如果你这样做,你不能在程序崩溃时抱怨,所以你不应该依赖它来做任何事情。
答案 1 :(得分:1)
您正在声明一个包含10个char
指针的数组。赋值a[0] = "hey"
,使指针a [0]指向字符串文字&#34;嘿&#34;它存储在只读存储器中,你丢失了字符串字面值&#34; hi&#34;。
分段错误是由于将空指针传递给循环中的函数printf(),超出了第三个元素。这称为未定义行为。