为什么;字符数组的初始值设定项字符串太长;在C&;不在C++;? 程序在C中编译警告,但C++编译失败。为什么?原因是什么 #include <stdio.h> int main(void) { char a[5]="Hello"; a[0]='y'; puts(a); for(int i=0;i<5;i++) printf("%c",a[i]); return 0; } 但是如果程序被编译成C++程序,那么C++编译器会给出以下错误: [Error] initializer-string for array of chars is too long [-fpermissive]

为什么;字符数组的初始值设定项字符串太长;在C&;不在C++;? 程序在C中编译警告,但C++编译失败。为什么?原因是什么 #include <stdio.h> int main(void) { char a[5]="Hello"; a[0]='y'; puts(a); for(int i=0;i<5;i++) printf("%c",a[i]); return 0; } 但是如果程序被编译成C++程序,那么C++编译器会给出以下错误: [Error] initializer-string for array of chars is too long [-fpermissive],c++,c,string,gcc,g++,C++,C,String,Gcc,G++,我正在使用GCC 4.8.1编译器。问题在下面一行 char a[5]="Hello"; 没有剩余空间来存储终止null 默认情况下,gcc在启用了-fpermissive选项的情况下不会产生任何错误。因此,它在C中编译得很好 根据语言标准的要求 对于C99标准,第6.7.9章第14段 字符类型的数组可以由字符串文字或UTF初始化−8字符串文字,可选地用大括号括起来。字符串文本的连续字节(如果有空间或数组大小未知,则包括终止的空字符)初始化数组的元素 对于C++11,第8.5.2章第2段

我正在使用GCC 4.8.1编译器。

问题在下面一行

char a[5]="Hello";
没有剩余空间来存储终止null

默认情况下,
gcc
在启用了
-fpermissive
选项的情况下不会产生任何错误。因此,它在
C
中编译得很好

根据语言标准的要求

  • 对于
    C99
    标准,第6.7.9章第14段
字符类型的数组可以由字符串文字或UTF初始化−8字符串文字,可选地用大括号括起来。字符串文本的连续字节(如果有空间或数组大小未知,则包括终止的空字符)初始化数组的元素

  • 对于
    C++11
    ,第8.5.2章第2段
初始值设定项的数量不得超过数组元素的数量


<> >,代码编译(带有警告),代码<>代码> gcc>代码>,在代码< > g++< /c>中产生错误。

C和C++中的有效字符串应该有<代码> 0 终止符和<< /P>
char a[5]="Hello";
没有空终止符的空间,并且a不是有效字符串


因此,这在C语言中可能不是一个错误,但在使用内置字符串函数(如
strlen()
和family)时,您肯定会遇到问题。

因为“Hello”是6
char
s长,而g++没有
-fpermissive
不会用它初始化5
char
数组,但是GCC会。

简短的答案:因为C和C++是不同的语言,规则不同。 详细回答:在这两种情况下,原因都是数组对于字符串文本来说太小。文本由五个可见字符组成,末尾有一个零终止符,因此总大小为6

在C语言中,您可以使用过长的字符串初始化数组;只需忽略额外字符:

C99 6.7.8/14:字符类型的数组可以由字符串文字初始化,也可以用大括号括起来。字符串文字的连续字符(如果有空间或数组大小未知,则包括终止的空字符)初始化数组的元素

编译器很有帮助地警告字符串太大,因为它几乎肯定指示错误;但它不能拒绝代码,除非您告诉它将警告视为错误

C++中,初始化器不允许大于数组:

C++11 8.5.2/2:初始值设定项的数量不得超过数组元素的数量

因此,对于该语言,编译器应该给出一个错误

在这两种语言中,当您希望字符串文字初始值设定器的字符数组大小合适时,可以忽略该大小,编译器将执行正确的操作

char a[] = "hello";  // size deduced to be 6

C和C++是不同的语言。它需要6个字符来存储hello作为ASCISZ字符串,你应该编码<代码> char a[] =“hello”;<代码>以确保具有终止0-byte@Milind:C是宽大的。C++是事实。这个问题的前提是错误的。这两次你都使用C++编译器,但一旦它默认为用<代码> -fimisty< /COD>编译。
-fpermissive
根本不是GCC C编译器选项!为什么C会允许这样做?@meet C一直都有,现在仍然有,以保持向后兼容。@meet:它被添加到(或者更确切地说,包括在)字符串文字中,是的。但不能将其添加到大小为5的数组中,因为这需要第六个元素。@meet空终止符的空间不在那里,因为我们已将数组定义为只有
5
char
字符。@meet:这与强类型无关;只是不同语言的不同规则。允许C截断初始化器以适应数组;C++不是。看看我对规则本身的回答。@SouravGhosh:如果你愿意的话。你不需要我的许可就可以引用语言标准,不要再说“先生”了;实际上这是不正确的答案。C标准不允许使用太长的字符串。这里发生的是对的约束冲突。请注意,与“终止null”不同,字符串文字的连续字符没有长度选项。这是错误的,用C中字符串文字的内容初始化非null固定大小的字符数组是完全正确的。
char a[] = "hello";  // size deduced to be 6