C-compileerfout: “Object met variabele grootte kan niet worden geïnitialiseerd”

Waarom krijg ik de foutmelding “Object met variabele grootte kan niet worden geïnitialiseerd” met de volgende code?

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

Antwoord 1, autoriteit 100%

Ik neem aan dat je een C99-compiler gebruikt (met ondersteuning voor arrays van dynamische grootte). Het probleem in uw code is dat op het moment dat de compilers uw variabeledeclaratie zien, het niet kan weten hoeveel elementen er in de array zijn (ik ga hier ook uit van de compilerfout dat lengthniet is een compileertijdconstante).

U moet die array handmatig initialiseren:

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

Antwoord 2, autoriteit 21%

Je krijgt deze foutmelding omdat je in C-taal geen initializers met arrays van variabele lengte mag gebruiken. De foutmelding die je krijgt zegt eigenlijk alles.

6.7.8 Initialisatie

3 Het type entiteit dat moet worden geïnitialiseerd, is:
een array van onbekende grootte of een object
type dat geen variabele lengte is
matrixtype.


Antwoord 3, autoriteit 11%

Dit geeft foutmelding:

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

Dit geeft ook een foutmelding:

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

Maar dit werkt prima:

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

U moet op de volgende manier waarde toevoegen:

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

Antwoord 4, autoriteit 3%

Na het declareren van de array

int boardAux[length][length];

de eenvoudigste manier om de beginwaarden als nul toe te wijzen, is door de for-lus te gebruiken, zelfs als deze een beetje lang kan zijn

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

Antwoord 5

De vraag is al beantwoord, maar ik wilde wijzen op een andere oplossing die snel is en werkt als het niet de bedoeling is dat de lengte tijdens runtime wordt gewijzigd. Gebruik macro #define voor main() om lengte te definiëren en in main() zal je initialisatie werken:

#define length 10
int main()
{
    int boardAux[length][length] = {{0}};
}

Macro’s worden uitgevoerd voordat de daadwerkelijke compilatie wordt uitgevoerd en de lengte is een constante tijdens het compileren (zoals vermeld door David Rodríguez in zijn antwoord). Het zal de lengte in feite vervangen door 10 vóór compilatie.


Antwoord 6

De array is niet geïnitialiseerd met het opgegeven geheugen en geeft een fout
variable sized array may not be initialised
Ik geef de voorkeur aan de gebruikelijke manier van initialiseren,

for (i = 0; i <= bins; i++)
        arr[i] = 0;

Antwoord 7

Verklaar lengte eenvoudig als een nadeel, als dat niet het geval is, moet u geheugen dynamisch toewijzen


Antwoord 8

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

Other episodes