在下面的代码中,我输出像(最后一个给出分段错误)
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)”
为什么?
答案 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]);