用另一个变量指定数组大小时,“变量可能未初始化”

时间:2019-03-30 09:00:24

标签: c code-composer

我正在尝试编译以下代码:

    int rows = 4;
    int columns = 4;
    int numblock[columns][rows] = {
                                   {0,0,0,0},
                                   {0,0,0,0},
                                   {0,0,0,0},
                                   {0,0,0,0}
    };

它告诉我变量可能没有初始化。当我改写int numblock [4] [4]时,编译器不会抱怨。

我想这与此有关:C compile error: "Variable-sized object may not be initialized"

有人可以向我解释一下吗?

编辑-根据操作员的评论

..我设置的列和行=4。它应该知道大小,不是吗?

2 个答案:

答案 0 :(得分:1)

答案已经在您提供的链接中,但是由于您不清楚链接的答案,因此我将尝试澄清。

首先-您拥有的称为VLA,即可变长度数组。想法很简单,您可以使用另一个变量来设置数组的大小。因此,可以在运行时中设置尺寸。

您遇到的问题是因为:不允许初始化VLA

就这么简单-C语言不支持。

当数组由数字(例如[4][4])定义时,它可以很好地与初始化程序配合使用。那是因为数组的大小在编译时

是已知的

您将rowscolumns初始化为4的事实没有区别。在创建数组之前,编译器不会跟踪这些变量是否已更改。例如这样的

void foo()
{
    int rows = 4;
    int columns = 4;
    rows = rows + 42;   // or scanf("%d", &rows) to get the number of rows from a user
    int numblock[columns][rows];  // no - initializer here - not allowed
}

即使您设置了rowscolumns常量(如const int rows = 4;),它在C中仍然无法正常工作(但在C ++中可以)。

“初始化” VLA的一种方法是使用内存集-例如:

void foo()
{
    int rows = 4;
    int columns = 4;
    int numblock[columns][rows];           // no - initializer here - not allowed
    memset(numblock, 0, sizeof numblock);  // but using memset is easy
}

如果您想要固定数量的行/列,C方法是使用defines。喜欢:

#define ROWS 4
#define COLUMNS 4

void foo()
{
    int numblock[ROWS][COLUMNS] = {
                                   {0,0,0,0},
                                   {0,0,0,0},
                                   {0,0,0,0},
                                   {0,0,0,0}
                                  };
}

这将起作用,因为defines编译时已解决

答案 1 :(得分:0)

我发现,如果我在变量声明中将n初始化为0,但是直到在程序主体内部才初始化数组(int main()),编译器才不会抱怨,并且程序按预期运行。这可能不是首选方法,我认为也许使用#define可能是一种更优雅的方法。