我正在尝试编译以下代码:
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。它应该知道大小,不是吗?
答案 0 :(得分:1)
答案已经在您提供的链接中,但是由于您不清楚链接的答案,因此我将尝试澄清。
首先-您拥有的称为VLA,即可变长度数组。想法很简单,您可以使用另一个变量来设置数组的大小。因此,可以在运行时中设置尺寸。
您遇到的问题是因为:不允许初始化VLA
就这么简单-C语言不支持。
当数组由数字(例如[4][4]
)定义时,它可以很好地与初始化程序配合使用。那是因为数组的大小在编译时
您将rows
和columns
初始化为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
}
即使您设置了rows
和columns
常量(如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可能是一种更优雅的方法。