【问题标题】:Simple but specific array compiling error (C)简单但特定的数组编译错误(C)
【发布时间】:2020-11-20 06:21:47
【问题描述】:

这是我写的:

   const int MAX=100;

   int main (){
       int notas [MAX]={0};

编译器会这样说:

[错误] 可变大小对象可能未初始化
[警告] 数组初始化器中的多余元素

当我用#define MAX 100MAX 时,它可以工作。但是我不明白这样做有什么问题?

【问题讨论】:

    标签: arrays c initialization declaration variable-length-array


    【解决方案1】:

    在这种情况下

     const int MAX=100;
    

    不创建编译时间常数,因此数组被视为VLA。根据定义,VLA 无法初始化,因此出现错误。

    另一方面,#define MAX 100 是一个预处理器宏,根据文本替换属性,它会产生一个编译时常数值100,那么数组不是 VLA,可以初始化根据初始化规则。

    【讨论】:

      【解决方案2】:

      这个

         const int MAX=100;
      int main (){
         int notas [MAX]={0};
      

      是一个可变长度数组的声明,其大小在运行时确定,因为变量 MAX 的声明不是 C 中的编译时常量。此类数组可能不会在声明中初始化。

      来自 C 标准(6.7.9 初始化)

      3 要初始化的实体的类型应该是一个数组 未知大小或不是可变长度的完整对象类型 数组类型。

      所以你可以写例如

         const int MAX=100;
      int main (){
         int notas [MAX];
         memset( notas, 0, MAX * sizeof( int ) );
      

      否则你可以使用编译时间常数,比如

         enum { MAX=100 };
      int main (){
         int notas [MAX]={0};
      

      【讨论】:

        【解决方案3】:

        尽管声明中有const

        const int MAX = 100;
        

        MAX 不是常量表达式(即,其值在编译时已知的东西)。它的值直到 运行时 才知道,所以 notas 的声明被视为可变长度数组声明,并且 VLA 声明可能没有初始值设定项(也不能声明 VLA在文件范围内,也不能是 structunion 类型的成员。

        使用预处理宏

        #define MAX 100
        

        符号MAX的所有实例在预处理后都被替换为文字100,因此它实际上与写作相同

        int notas[100] = {0};
        

        这就是使用预处理器宏起作用的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-05-24
          • 1970-01-01
          • 2019-05-10
          • 1970-01-01
          • 2022-11-30
          • 2016-02-04
          • 1970-01-01
          相关资源
          最近更新 更多