C compile error: “Variable-sized object may not be

2019-01-01 10:58发布

问题:

Why do I receive the error \"Variable-sized object may not be initialized\" with the following code?

int boardAux[length][length] = {{0}};

回答1:

I am assuming that you are using a C99 compiler (with support for dynamically sized arrays). The problem in your code is that at the time when the compilers sees your variable declaration it cannot know how many elements there are in the array (I am also assuming here, from the compiler error that length is not a compile time constant).

You must manually initialize that array:

int boardAux[length][length];
memset( boardAux, 0, length*length*sizeof(int) );


回答2:

You receive this error because in C language you are not allowed to use initializers with variable length arrays. The error message you are getting basically says it all.

6.7.8 Initialization

...

3 The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.



回答3:

This gives error:

int len;
scanf(\"%d\",&len);
char str[len]=\"\";

This also gives error:

int len=5;
char str[len]=\"\";

But this works fine:

int len=5;
char str[len]; //so the problem lies with assignment not declaration

You need to put value in the following way:

str[0]=\'a\';
str[1]=\'b\'; //like that; and not like str=\"ab\";


回答4:

After declaring the array

int boardAux[length][length];

the simplest way to assign the initial values as zero is using for loop, even if it may be a bit lengthy

int i, j;
for (i = 0; i<length; i++)
{
    for (j = 0; j<length; j++)
        boardAux[i][j] = 0;
}


回答5:

Simply declare length to be a cons, if it is not then you should be allocating memory dynamically



回答6:

For C++ separate declaration and initialization like this..

int a[n][m] ;
a[n][m]= {0};


回答7:

Another way C++ only:

const int n = 5;
const int m = 4;
int a[n][m] = {0};


回答8:

You cannot do it. C compiler cannot do such a complex thing on stack.

You have to use heap and dynamic allocation.

What you really need to do:

  • compute size (nmsizeof(element)) of the memory you need
  • call malloc(size) to allocate the memory
  • create an accessor: int* access(ptr,x,y,rowSize) { return ptr + y*rowSize + x; }

Use *access(boardAux, x, y, size) = 42 to interact with the matrix.