C编译错误:“可变大小的对象可能不会被初始化”
为什么我收到错误“variables大小的对象可能不被初始化”与下面的代码?
int boardAux[length][length] = {{0}};
我假设你正在使用C99编译器(支持dynamic大小的数组)。 你的代码中的问题是当编译器看到你的variables声明的时候,它不知道数组中有多less个元素(我也在这里假设,从编译器错误来看,这个length
不是一个编译时间常量)。
您必须手动初始化该数组:
int boardAux[length][length]; memset( boardAux, 0, length*length*sizeof(int) );
您会收到此错误,因为在C语言中不允许使用具有可变长度数组的初始化器。 你得到的错误信息基本上说了这一切。
6.7.8初始化
…
3要初始化的实体的types应该是未知大小的数组或不是可变长度数组types的对象types。
这给了错误:
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; }
对于像这样的C ++单独声明和初始化
int a[n][m] ; a[n][m]= {0};
只要声明长度是一个缺点,如果不是,那么你应该dynamic分配内存
你不能做到。 C编译器不能在堆栈上做这么复杂的事情。
你必须使用堆和dynamic分配。
你真的需要做什么:
- 计算所需内存的大小(n m sizeof(element))
- 调用malloc(size)来分配内存
- 创build一个访问器:int * access(ptr,x,y,rowSize){return ptr + y * rowSize + x; }
使用* access(boardAux,x,y,size)= 42与matrix交互。