【发布时间】:2016-07-21 05:39:09
【问题描述】:
运行以下程序时出现分段错误。
#include<stdio.h>
int main()
{
char *a[10] = {"hi", "hello", "how"};
int i ;
printf("%s %s %s %s %s\n",a[0],a[1],a[2],a[3],a[4]);
for (i = 0;i < 10; i++)
printf("%s\n",a[i]);
return 0;
}
输出
hi hello how (null) (null)
hi
hello
how
Segmentation fault (core dumped)
我有 gcc 版本 4.8.2 (Ubuntu 4.8.2-19ubuntu1) 和 Linux 内核 3.16.0-34-generic。
我知道所有未初始化的数组条目的值都是 0,所以我希望在 printf 处有一个null。
但它给出了分段错误。
奇怪的是,当我用 printf(“%s %d\n”,a[i],i) 替换 printf (“%s\n”,a[i]) 时,我能够为未填充的数组条目获得 null。
事实上%s 和\n 之间的空格也没有分段错误。
谁能告诉我这种行为背后的原因。
【问题讨论】:
-
只是为了澄清,分段错误只发生在
for循环之后,对吗?如果您要删除 for 循环,您不会收到任何错误? -
这很有趣。我已经完全复制了你的程序,它没有给我一个分段错误。
-
不要试图理解未定义的行为。这是没有意义的。
-
@Ari0nhh 这是未定义的,因为
NULL被传递给printf()的%s说明符,但不是因为数组可能包含未知值...数组 is 已初始化(未指定的值为NULL)。