Welche Bedeutung hat ein 0-Längen-Array in C? [Duplikat]

8
%Vor%

Was ist die Bedeutung von a[0] , warum auch 2d Array der Größe 0 erlaubt ist?

    
Utkarsh Srivastav 24.12.2011, 16:13
quelle

3 Antworten

9

Weder C noch C ++ erlauben Arrays mit einer Länge von Null, daher ist Ihr Programm schlecht geformt.

(z. B. C ++ 11, 8.3.4 / 1: "[Die Array-Größe] soll größer als Null sein".)

(Als ein Argumentpunkt: Ein Array mit der Länge Null wäre schwierig und verwirrend, um die Anforderung zu erfüllen, dass jedes Objekt eine eindeutige Adresse hat.)

Wie @sidyll darauf hinweist, sind Arrays der Länge Null als Erweiterung in GCC verfügbar .

    
Kerrek SB 24.12.2011, 16:14
quelle
3

Sie finden Ihre Antwort in dem GCC-Handbuch

Wenn Sie c99 verwenden

  
  • Flexible Array-Mitglieder werden als Inhalt [] ohne die 0 geschrieben.
  •   
  • Flexible Array-Elemente haben einen unvollständigen Typ, und daher wird der Operator sizeof möglicherweise nicht angewendet. Als eine Eigenart der ursprünglichen Implementierung von Arrays der Länge 0 wird sizeof zu Null ausgewertet.
  •   
  • Flexible Array-Mitglieder dürfen nur als letztes Mitglied einer Struktur erscheinen, die ansonsten nicht leer ist.
  •   
  • Eine Struktur, die ein flexibles Array-Element oder eine Union enthält, die eine solche Struktur enthält (möglicherweise rekursiv), darf kein Mitglied einer Struktur oder eines Elements eines Arrays sein. (Diese Anwendungen sind jedoch von GCC als Erweiterungen zulässig.
  •   

Und natürlich, wie sie nützlich sein können:

  

Zero-Length-Arrays sind in GNU C erlaubt. Sie sind sehr nützlich als letztes Element einer Struktur, die wirklich ein Header für ein Objekt mit variabler Länge ist:

%Vor%
    
Anil Kumar Arya 24.12.2011 16:27
quelle
1

In Ihrem Beispiel wird nicht viel verwendet, aber Arrays mit einer Größe von Null wurden häufig in Strukturen verwendet, in denen das letzte Element dynamisch skaliert wurde:

%Vor%

Die Verwendung eines Arrays der Länge Null ist:

1) variable_elements hat eine Adresse (trotz der Antwort von jemandem)
2) es hat auch Array-Semantik 3) Berechnung der dynamischen Größe des Arrays ist vereinfacht

Leider würden einige Compiler (MSC) einen Zischen über eine solche Konstruktion werfen und eine geringere, beschwichtigende, technisch inkorrekte Neuformulierung erzwingen:

%Vor%

Stellen Sie sich ein Array der Größe Null als Platzhalter vor. Es gibt wenig Notwendigkeit, das mehr zu tun, es sei denn, Sie müssen C verwenden, was in vielen eingebetteten Umgebungen der Fall ist.

    
wallyk 24.12.2011 16:47
quelle

Tags und Links