3

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

 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;
}

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

"U s HelloThisisatest (null)"

为什么?

4

3 回答 3

11

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

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

  • 下一个 printf 访问字符串的第 8 个字符,即s.

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

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

编辑

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

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

于 2012-09-29T04:31:22.930 回答
1

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

a[1][0]

超出数组。此特定数组的第一个索引必须始终为 0。

于 2012-09-29T04:33:02.900 回答
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]);
于 2012-09-29T07:53:28.503 回答