没有逗号的数组初始化

fuz*_*zzy 3 c string pointers cstring

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

 U   
 s    
 HelloThisisatest    
 Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

"你的HelloThisisatest(null)"

为什么?

pho*_*xis 11

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

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

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

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

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

编辑

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

相邻的字符串文字标记是连接的.