Warum kann ich kein Array erstellen, dessen Größe durch eine globale Variable bestimmt wird?
Lesezeit: 5 Minuten
Ashish Yadav
Warum funktioniert das Array a nicht durch globale Variable initialisiert werden size?
#include<stdio.h>
int size = 5;
int main()
{
int a[size] = {1, 2, 3, 4, 5};
printf("%d", a[0]);
return 0;
}
Der Kompilierungsfehler wird als angezeigt
Objekt mit variabler Größe darf nicht initialisiert werden
Meiner Meinung nach sollte das Array von initialisiert werden size.
Und was wäre die Antwort, wenn ich darauf bestehe, globale Variablen zu verwenden (wenn es möglich ist)?
Verwenden -std=c99 beim Kompilieren mit GCC, um Arrays mit variabler Größe zu aktivieren.
– Michael S
11. März 2010 um 18:06 Uhr
Sie sind bereits aktiviert – wenn er im c89-Modus wäre, wäre der Fehler so etwas wie ISO C90 forbids variable length array 'a'.
– Steve Jessop
11. März 2010 um 18:26 Uhr
Steve Jessop
In C99, 6.7.8/3:
Der Typ der zu initialisierenden Entität muss ein Array unbekannter Größe oder ein Objekttyp sein, der kein Array-Typ mit variabler Länge ist.
6.6/2:
Ein konstanter Ausdruck kann während der Übersetzung anstatt zur Laufzeit ausgewertet werden
6.6/6:
Ein ganzzahliger konstanter Ausdruck muss einen ganzzahligen Typ haben und darf nur Operanden haben, die ganzzahlige Konstanten, Aufzählungskonstanten, Zeichenkonstanten, Größenausdrücke, deren Ergebnisse ganzzahlige Konstanten sind, und Gleitkommakonstanten, die die unmittelbaren Operanden von Umwandlungen sind.
6.7.5.2/4:
Wenn die Größe ein ganzzahliger konstanter Ausdruck ist und der Elementtyp eine bekannte konstante Größe hat, ist der Array-Typ kein Array-Typ mit variabler Länge; andernfalls ist der Array-Typ ein Array-Typ mit variabler Länge.
a hat einen Array-Typ mit variabler Länge, weil size ist kein ganzzahliger konstanter Ausdruck. Daher kann es keine Initialisiererliste haben.
In C90 gibt es keine VLAs, daher ist der Code aus diesem Grund illegal.
In C++ gibt es auch keine VLAs, die man aber machen könnte size a const int. Das liegt daran, dass Sie in C++ verwenden können const int Variablen in ICEs. In C geht das nicht.
Vermutlich hattest du keine Absicht a um eine variable Länge zu haben, was Sie also brauchen, ist:
#define size 5
Wenn Sie es wirklich vorhatten a Um eine variable Länge zu haben, könnten Sie Folgendes tun:
int a[size];
int initlen = size;
if (initlen > 5) initlen = 5;
memcpy(a, (int[]){1,2,3,4,5}, initlen*sizeof(int));
Oder vielleicht:
int a[size];
for (int i = 0; i < size && i < 5; ++i) {
a[i] = i+1;
}
Es ist allerdings schwer zu sagen, was hier im Fall von size != 5 passieren „sollte“. Es ist nicht wirklich sinnvoll, für ein Array mit variabler Länge einen Anfangswert mit fester Größe anzugeben.
Einzeln
Sie müssen dem Compiler nicht mitteilen, wie groß das Array ist, wenn Sie einen Initialisierer angeben. Der Compiler ermittelt die Größe anhand der Anzahl der Elemente, mit denen Sie ihn initialisieren.
int a[] = {1,2,3,4,5};
Dann können Sie sich sogar die Größe vom Compiler mitteilen lassen, indem Sie die Gesamtgröße des Arrays in Bytes abrufen sizeof(a) und dividiert es durch die Größe eines Elements sizeof(a[0]):
int size = sizeof(a) / sizeof(a[0]);
Was wäre, wenn ich zum Beispiel auch alles auf Null initialisieren wollte? int myArray [numRows][numCols] = {{0}}; Gibt es eine Möglichkeit, die Variablen numRows und numCols auf der linken Seite zu überspringen, aber nicht alle Nullen auf der rechten Seite ausschreiben zu müssen?
– VeraKozya
17. Februar 2018 um 0:18 Uhr
Wäre es nicht weniger zweideutig, die Anzahl der tatsächlichen Elemente im Array als zu bezeichnen Länge und die Anzahl von Bytes, die das Array auf der Speicherebene umfasst, als Größe ? Dies hätte den Vorteil, dass es besser mit der Standardbedeutung übereinstimmt, die von verwendet wird sizeof -Operator, der einfach die Anzahl der Rohbytes des Arrays berechnet und zurückgibt.
– Programmierer
10. Juli 2018 um 9:02 Uhr
Der Compiler kann nicht davon ausgehen, dass der Wert von size immer noch 5 ist, wenn main() die Kontrolle übernimmt. Wenn Sie in einem alten C-Projekt eine echte Konstante wollen, verwenden Sie:
#define size 5
Guter Punkt. Lösung kann auch Verwendung von neumodischen sein const int size = 5
– Verschmelzung
19. Juli 2019 um 9:09 Uhr
IVlad
size ist eine Variable, und C erlaubt nicht die Deklaration von (bearbeiten: C99 erlaubt Ihnen, sie zu deklarieren, aber nicht zu initialisieren, wie Sie es tun) Arrays mit variabler Größe wie diese. Wenn Sie ein Array erstellen möchten, dessen Größe eine Variable ist, verwenden Sie malloc oder machen Sie die Größe zu einer Konstante.
Der Compiler muss die Größe des Arrays kennen, während er es deklariert. Weil sich die Größe eines Arrays nach seiner Deklaration nicht ändert. Wenn Sie die Größe des Arrays in eine Variable einfügen, können Sie sich vorstellen, dass sich der Wert dieser Variablen ändert, wenn das Programm ausgeführt wird. In diesem Fall wird der Compiler gezwungen, diesem Array zusätzlichen Speicher zuzuweisen. In diesem Fall ist dies nicht möglich, da das Array eine statische Datenstruktur ist, die auf dem Stack allokiert ist. Ich hoffe, dass dies helfen wird.
Es sieht so aus, als ob Ihr Compiler nicht C99-konform ist … Apropos, welchen Compiler verwenden Sie? Wenn es gcc ist, müssen Sie den Schalter ‘-std=c99’ übergeben…. wenn Sie einen Pre-C99-Compiler verwenden, ist diese Anweisung illegal, wenn das der Fall ist, tun Sie Folgendes:
int main() {
int a[5]={1,2,3,4,5};
printf("%d",a[0]);
return 0;
}
Verwenden Sie in Standard-Compilern vor C99 eine Konstante anstelle einer Variablen.
Bearbeiten: Sie können mehr über den C99-Standard erfahren hier… und hier….
Pratik Deoghare
#include<stdio.h>
/* int size=5; */
#define size 5 /* use this instead*/
/*OR*/
int a[size]={1,2,3,4,5}; /* this*/
int main()
{
int a[size]={1,2,3,4,5};
printf("%d",a[0]);
return 0;
}
int size bedeutet, dass size ist ein Variable und C erlaubt es nicht Variablesize Arrays.
Ich verwende VS2008, wo ich verwende
const int size=5;
erlaubt
int a[size]={1,2,3,4,5};
Warum kann ich keine globalen Variablen verwenden?
– Ashish Yadav
11. März 2010 um 18:06 Uhr
@ashish: weil globale Variablen immer noch Variablen sind (der Hinweis liegt im Namen). Angenommen, jemand hat den Wert zugewiesen 1 zu size irgendwo vor Ihrem Code zu definieren a. Dann würden Sie versuchen, ein Array der Größe 1 mit einer Initialisierungsliste der Größe 5 zu initialisieren. Anstatt zu versuchen, dieses Durcheinander zu beseitigen, verbietet der Standard dies.
– Steve Jessop
11. März 2010 um 18:13 Uhr
“Größe ist eine Variable und C erlaubt keine Arrays mit variabler Größe.” Wir sollten Ihrem Kommentar einen Punkt hinzufügen: Wenn wir die Variable initialisieren, erlaubt C die Definition eines Arrays mit dieser Variablen. ZB int size = 5; int ein[size]; ist völlig in Ordnung.
– Pedram
21. Februar 2017 um 23:52 Uhr
13851600cookie-checkWarum kann ich kein Array erstellen, dessen Größe durch eine globale Variable bestimmt wird?yes
Verwenden
-std=c99
beim Kompilieren mit GCC, um Arrays mit variabler Größe zu aktivieren.– Michael S
11. März 2010 um 18:06 Uhr
Sie sind bereits aktiviert – wenn er im c89-Modus wäre, wäre der Fehler so etwas wie
ISO C90 forbids variable length array 'a'
.– Steve Jessop
11. März 2010 um 18:26 Uhr