gpt4 book ai didi

c - 使用另一个变量指定数组大小时为 "Variable may not be initialized"

转载 作者:行者123 更新时间:2023-11-30 20:18:01 24 4
gpt4 key购买 nike

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

    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"

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

编辑 - 来自 op 的评论:

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

最佳答案

答案已经在您提供的链接中,但我会尽力澄清,因为您不清楚链接的答案。

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

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

就这么简单 - 只是 C 不支持它。

当数组是用数字定义时(例如[4][4]),它可以与初始值设定项配合良好。这是因为数组的大小在编译时

是已知的

初始化为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 的一种方法是使用 memset - 例如:

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}
};
}

这会起作用,因为定义编译时解析

关于c - 使用另一个变量指定数组大小时为 "Variable may not be initialized",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55429783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com