【问题标题】:How to initialize multidimentional array in C Programming如何在 C 编程中初始化多维数组
【发布时间】:2018-05-05 03:09:32
【问题描述】:

我在运行这段代码时遇到错误

int row1=2,col1=2;

int mat1[row1][col1]=
{
    {1,5},
    {4,6}
};

这段代码有什么问题??

IDE:代码块

错误:可变大小的对象可能未初始化|

【问题讨论】:

  • 错误说明了一切。
  • 错误说明了一切。您正在尝试制作一个二维可变长度数组并将其发送给初始化程序。由于它是 VLA,它的维度在编译时是未知的,那么如何给它一个固定维度的初始化器呢?
  • 我很困惑为什么你需要一个可变大小的数组和一个固定大小的初始化器。这真的没有意义。运行时需要不同大小的数组吗?
  • 我想知道 this 是如何获得投票的?你真的不能在错误消息中更具体......
  • @Lundin memcpy 能给你带来什么,尤其是如果尺寸可能真的需要改变?

标签: c arrays initialization variable-length-array


【解决方案1】:

根据 C 规范,数组定义如下

int mat1[row1][col1]=
{
    {1,5},
    {4,6}
};

是一个VLA (Variable Length Array),无法初始化。

引用C11,第 §6.7.6.2/P4 章,

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

和章节§6.7.9

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

您需要使用编译时常量表达式作为数组维度才能使用大括号括起来的初始化器。

您可以为此使用#define MACRO,例如

#define ROW 2  //compile time constant expression
#define COL 2  //compile time constant expression

int mat1[ROW][COL]=
{
    {1,5},
    {4,6}
};

【讨论】:

  • 巴姆。有效。这意味着我需要在 MACRO 中将变量设为 final。
  • @Enam 它必须是编译时常量,仅此而已。
  • 但是我需要在运行时初始化数组的大小。现在我该怎么做???
  • @Enam 您需要了解,初始化发生在编译时,您不能有一个 VLA(它在运行时确定大小)在编译时进行初始化。也许你需要指针和内存分配器函数。
【解决方案2】:

您正在尝试初始化一个可变大小的对象。您可以稍后尝试在其他地方分配值,或者简单地使用数字而不是变量。

【讨论】:

    【解决方案3】:

    这里有一个可变长度数组。这样的数组无法初始化。如果维度是常量(即数字常量,而不是声明为 const 的变量),则只能初始化数组:

    int mat1[2][2]=
    {
        {1,5},
        {4,6}
    };
    

    【讨论】:

    • 确实如此,但我怀疑 OP 不理解整数文字和通过宏表示的整数常量之间的区别。如果没有这种理解,这个答案似乎过于严格。
    • 使用固定的初始化程序,除了更改宏时出现错误的风险之外,维度的宏还能为您带来什么?
    • @FelixPalmen 不多,尤其是对于多维数组,但如果您希望最后为零,它可能是有意义的。
    猜你喜欢
    • 1970-01-01
    • 2011-04-03
    • 2015-02-26
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多