【问题标题】:C error: variable-sized object may not be initialized [duplicate]C错误:可变大小的对象可能未初始化[重复]
【发布时间】:2021-03-02 23:24:30
【问题描述】:

我目前正在从 youtube 学习 C 语言,这是关于 2D 数组的代码之一:

#include<stdio.h>

int main()
{

    int const columns = 3;
    int const rows = 2;
    int grades[rows][columns] = {
        {12, 23, 45},
        {64, 78, 89}
    };
    
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < columns; j++)
        {
            printf("%d ", grades[i][j]);
        }
    }
    
    return 0;
}

但是当我尝试运行它时,它显示错误“错误:可变大小的对象可能未初始化”

int grades[rows][columns] = {

      |     ^~~
tempCodeRunnerFile.c:8:10: warning: excess elements in array initializer

    8 |         {12, 23, 45},
      |          ^~
tempCodeRunnerFile.c:8:10: note: (near initialization for 'grades[0]')

如此等等。我想不通,它一直在困扰我。

【问题讨论】:

  • 正如错误所说:C 标准不允许这样做。如果您使用的是 Microsoft Visual C,则根本无法使用 VLA。

标签: c initialization declaration variable-length-array constant-expression


【解决方案1】:

在 C 中,非可变长度数组的大小应为整数常量表达式,其定义方式如下(C 标准,6.6 常量表达式)

6 整数常量表达式 117) 应具有整数类型,并且应 只有整数常量、枚举常量的操作数, 字符常量,结果为整数的表达式 sizeof 常量和作为直接操作数的浮点常量 演员表。整数常量表达式中的强制转换运算符只能 将算术类型转换为整数类型,但作为 sizeof 运算符的操作数。

和(C 标准,6.7.6.2 数组声明符)

  1. ...如果大小是整数常量表达式并且元素类型具有 一个已知的常量大小,数组类型不是变长数组类型; 否则,数组类型为变长数组类型。

最后(C 标准,6.7.9 初始化)

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

因此,即使带有限定符 const 的变量也不能在整数常量表达式中使用。

因此在此声明中

int grades[rows][columns] = {
    {12, 23, 45},
    {64, 78, 89}
}; 

声明了一个变长数组,根据最后的引用可能没有被初始化。

您有两种方法来定义数组的大小。要么使用定义的预处理器常量,如

#define columns 3
#define rows 2

或者使用枚举常量,如

enum { columns = 3, rows = 2 };
int grades[rows][columns] = {
    {12, 23, 45},
    {64, 78, 89}
};

【讨论】:

  • 好吧..我明白了。非常感谢!
【解决方案2】:

代码是C 而不是C++ 所以这个:

int const columns = 3;
int const rows = 2;
int grades[rows][columns] = {
    {12, 23, 45},
    {64, 78, 89}
};

需要改成:

#define COLUMNS 3
#define ROWS 2
int grades[ ROWS ][ COLUMNS ] = {
    {12, 23, 45},
    {64, 78, 89}
};

【讨论】:

  • 或 constexpr 变量
  • 好的..谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 2019-02-21
  • 2017-03-06
  • 2011-03-06
相关资源
最近更新 更多