预计会看到“charmer数组的初始化字符串太长”警告

时间:2015-09-29 03:51:23

标签: c gcc

我希望使用gcc看到以下程序中的两个变量的“初始化字符串数组的字符串太长”。

程序:

int main()
{
   char str1[4]="1234";
   char str2[3]="1234";

   (void)str1; // Remove unused variable warning.
   (void)str2; // Remove unused variable warning.
   return 0;
}

但是,我只收到str2的警告。

char str1[4]="1234";

相当于

char str1[4]= {'1', '2', '3', '4', '\0'};

我们不应该同时收到str1的警告吗?

这是gcc中的缺陷吗?

编译器命令:

  

gcc -Wall -std = c99 soc.c -o soc

gcc版本为4.8.4。

更新

刚才了解到

char str1[4]="1234";

不等于

char str1[4]= {'1', '2', '3', '4', '\0'};

更新2

char str1[4]="1234";

在C ++ 11中不正确(第8.5.2 / 2节)。我不认为C99和C ++ 11会以不同的方式对待它们。

1 个答案:

答案 0 :(得分:7)

C标准第6.7.9节的内容为:

  
      
  1. 字符类型的数组可以由字符串初始化   文字或UTF -8字符串文字,可选择用大括号括起来。   字符串文字的连续字节(包括终止   如果有空间或数组大小未知,则为null字符)   初始化数组的元素。
  2.         

    ...

         
        
    1. 例8

           

      声明

      char s[] = "abc", t[3] = "abc";
      
           

      定义''plain''char数组对象s和t,其元素用字符串文字初始化。该声明与

      相同
      char s[] = { 'a', 'b', 'c', '\0' }, t[] = { 'a', 'b', 'c' };
      
    2.   

(强调我的)。

也就是说,如果它不适合固定的已知大小数组,则不会添加终止空字符。