在C语言中,是否只对一个元素的数组初始化进行了特殊处理?

在C语言中,是否只对一个元素的数组初始化进行了特殊处理?,c,arrays,C,Arrays,在阅读时,我想测试GCC中的输入,看看会输出什么错误。令我惊讶的是,下面这句话: char array[] = {"s"}; 编译时不会出现错误或警告,从而生成一个大小为2的数组,其中包含“s\0”。我本以为会出现编译器错误,因为表达式右侧的类型为char*[] 在这种情况下,只有一个元素的数组初始化是否不被视为数组,为什么 char array[] = {"s"}; 同: char array[] = "s"; 在这种情况下,{}是可选的,因为“s”是字符串文字 或者 在这种情况下,{}

在阅读时,我想测试GCC中的输入,看看会输出什么错误。令我惊讶的是,下面这句话:

char array[] = {"s"};
编译时不会出现错误或警告,从而生成一个大小为2的数组,其中包含
“s\0”
。我本以为会出现编译器错误,因为表达式右侧的类型为
char*[]

在这种情况下,只有一个元素的数组初始化是否不被视为数组,为什么

char array[] = {"s"};
同:

char array[] = "s";
在这种情况下,
{}
是可选的,因为“s”是字符串文字

或者


在这种情况下,
{}
是初始化数组所必需的。

正确初始化的字符串是:

char array[] = "something";
这是一个10字符的数组

但如果你写:

`char* array = "something";`
`它是另一个对象,您将无法修改数组的内容

以及:

char* array[]  
不是字符串

它是一个字符指针数组(char*)。您需要为每个字符分配内存*

经验:

char* array[3];
array[0] = malloc (10*sizeof(char));
strcpy(array[0] , "hello");
但是,要拥有char*数组,您不能直接执行以下操作:

char* array[3];
array[0] = "hello";
都不是:

char* array[] = {"first","second","other one","last"};
使用此init,无法修改字符串

对于那些说我写的完全错误的人来说,你知道一个字符*需要一个内存分配吗


那么为什么使用-6或更多?

特别是在C中,您可以使用{}初始化标量。。。然而,我不知道这是否对对齐有任何影响。不。。对对齐没有影响:)正常。所以我不得不考虑这个情况下的全部表达,而不仅仅是左侧。code>{“s”}肯定与
“s”
不同,例如
字符数组*[]={“s”}有效,但
字符数组*[]=“s”
不是。@Antoine:当你说,
char array*[]
你在声明一个指针数组时,在这种情况下,你必须提供一个初始值设定项列表。好的,这就回答了我评论中的问题:初始化表达式右侧的含义取决于左侧的类型,听起来很奇怪。@cpx:
char-array*[]
不是合法声明。
char* array[] = {"first","second","other one","last"};