printf与换行符导致奇怪的seg。故障

时间:2014-07-29 05:24:12

标签: c linux

我在执行此代码段时发现了一种奇怪的行为

#include <stdio.h>

void main()
{
    char *a[10] = {"hi", "hello", "how"};
    int i = 0, j = 0;
    for (i = 0;i < 10; i++)
            printf("%s\n", a[i]);
}

输出:

hi
hello
how
Segmentation fault

但是如果我用printf语句中的空格字符替换'\ n'字符,那么就没有seg。错误即将到来

hi hello how (null) (null) (null) (null) (null) (null) (null) 

我在Ubuntu上使用gcc v4.4.3。 换行符如何导致seg。 printf中的错误?

5 个答案:

答案 0 :(得分:6)

你拥有的是undefined behavior。你有一个指向char的十个指针的数组,但只有三个实际指向有效的东西,而其余的指针是NULL指针。取消引用NULL指针会导致未定义的行为,某些时候可以工作,有时会导致程序崩溃。

答案 1 :(得分:5)

行为上的差异是由于gcc将printf("%s\n", ...)优化为puts(...),这在功能上是相同的,除非字符串为NULL

在第二种情况下,gcc不能优化呼叫,因此输出不同。

答案 2 :(得分:1)

您有未定义的行为。您只初始化了3个指针,其余指针指向NULL。当您尝试打印NULL指针时导致未定义的行为。

尝试以下方式,它将适合您。

void main()
{
char a[10][10] = {"hi", "hello", "how"}; // here statically i am allocating array. 
// First three elements are initialized and the remaining elements contains null.
int i = 0, j = 0;
for (i = 0;i < 10; i++)
        printf("%s\n", a[i]);
}

答案 3 :(得分:0)

只初始化数组中的前三项(由三个字符串组成)。在尝试访问它们之前,您需要初始化其他七个char *指针。

答案 4 :(得分:-1)

您只初始化了10个阵列成员中的3个。访问未初始化指针的行为是未定义的。有时会崩溃,有时候不会崩溃。