我在执行此代码段时发现了一种奇怪的行为
#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中的错误?
答案 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个。访问未初始化指针的行为是未定义的。有时会崩溃,有时候不会崩溃。