Definiert ein leeres array in c
Was passiert eigentlich in folgendem Programm, ich habe ein leeres array int arr[];
im code und mit dem GCC-compiler, aber der compiler nicht einen Fehler. Es wird erfolgreich gearbeitet.
#include <stdio.h>
#include <stdlib.h>
typedef struct st
{
int i;
int arr[];
}ST,*ptr;
int main()
{
ST s1;
ptr p1= (ptr)malloc(sizeof(ST)+4*sizeof(int));
p1->i=10;
p1->arr[0]=1;
p1->arr[3] = 1;
printf("%d\n",p1->arr[3]);
printf("%ld\n", sizeof(s1));
}
C
Sprache nicht erlaubt undefined array-Länge. aber GCC-compiler erlaubt. Warum?
Einfach nur neugierig, was ist eigentlich passiert?
- C-Norm dies zulässt. Suche für "flexible array member".
- Flexible array member, zwei Vorschläge: don ' T cast
malloc
und verstecken sich nicht-Zeiger mittypedef
s - Als das Letzte Element der Struktur, ist es nützlich, wenn die Struktur speichert eine variable Menge von Daten.
- Ich danke Ihnen, sir, ich nicht bewusst mit diesem Thema..
- Es ist ein C99-feature; nicht in out-of-date C-Compiler (insbesondere in einigen Versionen von Microsoft Visual Studio).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gültig und zulässig, da C99. Es heißt flexible array member - nützlich, um das Letzte Element der struct-variable-Länge-und es muss das Letzte Element der Struktur, wenn verwendet.
Du suchst, in ein C99-feature, Flexible array-member. Wenn das array definiert ist, die am Ende der Struktur ist, dann definieren Sie Ihre Größe bei der Zuweisung über malloc, durch Zuweisung einer größeren chunk-Speicher.
für ein array der Größe
len
:C99, die Struktur, die das Letzte element erlaubt die Größe des Arrays unbekannt ist, die aufgerufen wird, eine flexible array member, aber vor dem Aufbau ein flexibles array-Element muss mindestens einem weiteren Mitglied.
Flexible array-member erlaubt, um die Struktur enthält ein array mit variabler Größe. Diese Größe der Struktur sizeof gibt nicht sind eine flexible Palette von Speicher. Struktur, bestehend aus einem flexible array-member mit
malloc ()
Funktion reserviert Speicher dynamisch reserviert Speicher sollte größer sein als die Größe der Struktur, um Platz für die zu erwartende Größe der flexiblen Anordnung.Grundmodell
Getestet unter linux-gcc-über die Betriebs-Ergebnisse für die Struktur, die das Letzte element aus einem array und ein array von undefinierter Länge, die operativen Ergebnisse konsistent mit der Theorie, das ist ein bisschen wie eine Klasse in c ++ member-Funktionen member-Funktionen ist nicht besetzten Klasse Platz Größe. Gut, diese flexible array, es ist die Rolle dessen, was ist.