【问题标题】:Partially filled array in c gives segmentation fault while printing in C [duplicate]c中部分填充的数组在C中打印时会出现分段错误[重复]
【发布时间】: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)。

标签: c arrays


【解决方案1】:

根据您的编译器,您的第二个 printf 将替换为 puts

assembly result 并且您的puts 的系统实现似乎会以NULL 作为参数而崩溃。

【讨论】:

  • 除此之外,printf("%s", NULL); 是未定义的行为,因此它曾经奏效的事实更多是出于巧合的慷慨而非预期。不应该依赖这种代码......
  • 您肯定在这里指出了问题的要点,我只是指出了为什么这两个调用的行为可能不同。
  • 确实如此。您的回答解释了一个很好的例子,其中慷慨被剥夺以支持优化(也是巧合)。
猜你喜欢
  • 2013-11-10
  • 1970-01-01
  • 2018-06-16
  • 2015-01-27
  • 2020-02-04
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多