没有逗号的数组初始化

时间:2012-09-29 04:30:04

标签: c string pointers cstring

在下面的代码中,我输出像(最后一个给出分段错误)

 U   
 s    
 HelloThisisatest    
 Segmentation fault (core dumped)

但我不明白为什么。 代码是

int main()
{
   char *a[]={"Hello" "This" "is" "a" "test"};
   printf("%c\n",a[1][0]);
   printf("%c\n",a[0][8]);
   printf("%s\n",a[0]);
   printf("%s\n",a[3]);
   return 0;
}

另一个问题是我们可以在不使用逗号的情况下初始化二维数组吗? 当我用\n替换\t s然后输出更改时,我得到的另一种情况是

“你的HelloThisisatest(null)”

为什么?

3 个答案:

答案 0 :(得分:11)

这是因为在C中,两个相邻的字符串连接成一个。所以“Hello”“World”实际上是一个字符串“HelloWorld”。

  • 在您的情况下,指针数组实际上包含一个字符串“HelloThisisatest”。在第一个printf中,您正在访问位置1,这是未定义的行为。

  • 下一个printf访问字符串的字符8 s

  • 第三个printf打印存储在0位置的整个字符串,即“HelloThisisatest”

  • 最后一个printf尝试访问数组位置3,这是未定义的行为,因为它未初始化。

修改

参见C11 / C99标准第5.1.1.2节第6段,其中说明:

  

连接相邻的字符串文字标记。

答案 1 :(得分:1)

你有一个指向char的指针数组。但是,只有一个这样的指针,所以代码如下:

a[1][0]

超出阵列。对于这个特定的数组,第一个索引必须始终为0。

答案 2 :(得分:1)

你可能想要这样做:

char a[][20] = {"Hello", "This", "is", "a", "test"};

请注意,第二个维度的大小(20

现在你可以打印所有单词:

printf("%s\n",a[0]);
printf("%s\n",a[1]);
printf("%s\n",a[2]);
printf("%s\n",a[3]);
printf("%s\n",a[4]);