为什么我会收到错误“可变大小的对象可能未初始化”的错误代码?
int boardAux[length][length] = {{0}};
为什么我会收到错误“可变大小的对象可能未初始化”的错误代码?
int boardAux[length][length] = {{0}};
我假设您使用的是 C99 编译器(支持动态大小的数组)。您的代码中的问题是,当编译器看到您的变量声明时,它无法知道数组中有多少元素(我在这里也假设,编译器错误length
不是编译时间常数)。
您必须手动初始化该数组:
int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );
您收到此错误是因为在 C 语言中您不允许使用具有可变长度数组的初始化程序。您收到的错误消息基本上说明了一切。
6.7.8 初始化
...
3 要初始化的实体的类型应该是一个未知大小的数组或一个不是可变长度数组类型的对象类型。
这给出了错误:
int len;
scanf("%d",&len);
char str[len]="";
这也给出了错误:
int len=5;
char str[len]="";
但这很好用:
int len=5;
char str[len]; //so the problem lies with assignment not declaration
您需要通过以下方式赋予价值:
str[0]='a';
str[1]='b'; //like that; and not like str="ab";
声明数组后
int boardAux[length][length];
将初始值分配为零的最简单方法是使用 for 循环,即使它可能有点长
int i, j;
for (i = 0; i<length; i++)
{
for (j = 0; j<length; j++)
boardAux[i][j] = 0;
}
问题已经得到解答,但我想指出另一种解决方案,如果不打算在运行时更改长度,它可以快速运行。在 main() 之前使用宏 #define 来定义长度,在 main() 中,您的初始化将起作用:
#define length 10
int main()
{
int boardAux[length][length] = {{0}};
}
宏在实际编译之前运行,长度将是编译时常量(正如 David Rodríguez 在他的回答中提到的那样)。它实际上会在编译之前用 10 替换长度。
数组未使用指定的内存进行初始化 anf 抛出错误
variable sized array may not be initialised
我更喜欢通常的初始化方式,
for (i = 0; i < bins; i++)
arr[i] = 0;
可变长度数组是编译器在编译时不知道其长度的数组。在你的情况下length
是一个变量。我得出这个结论,因为如果length
是一个例如定义为文字整数的预处理器宏,那么您的初始化将起作用。1989 年的第一个 C 语言标准不允许可变长度数组,它们是在 1999 年添加的。C 标准仍然不允许使用像您这样的表达式来初始化这些(尽管有人可能会争辩说它可以或应该允许它)。
初始化变量数组的最佳方法是这样的:
int boardAux[length][length];
memset( boardAux, 0, sizeof(boardAux) );
memset
是一个非常快速的标准库函数,用于初始化内存(在上述情况下为 0)。sizeof(boardAux)
返回 占用的字节数boardAux
。sizeof
始终可用,但memset
需要#include <string.h>
. 是的 -sizeof
允许可变大小的对象作为参数。
请注意,如果您有一个普通数组(不是可变长度)并且只想将内存初始化为零,那么您永远不需要嵌套括号,您可以像这样初始化它:
struct whatEver name[13][25] = {0};
int size=5;
int ar[size ]={O};
/* This operation gives an error -
variable sized array may not be
initialised. Then just try this.
*/
int size=5,i;
int ar[size];
for(i=0;i<size;i++)
{
ar[i]=0;
}
只需将长度声明为缺点,如果不是,那么您应该动态分配内存