2013-10-23 8 views
5

Unterschied zwischen diesen Deklarationen?String-Array-Deklaration in c

1.

char **strings = {"abc", "bca", "rat", "tar", "far"}; 

2.

char *strings[] = {"abc", "bca", "rat", "tar", "far"}; 

3.

char strings[][] = {"abc", "bca", "rat", "tar", "far"}; 

Nur (2) ist eine gültige Erklärung. Was ist der Unterschied zwischen diesen Typen und warum sind (1) und (3) nicht gültig?

+3

Wer hat gesagt, dass nur 2 gültig ist? –

+0

Wenn ich kompiliere und versuche nur zu drucken 2) funktionierte. –

+0

Das hängt davon ab, wie Sie gültig definieren. Als "gültige Erklärung" sind sie alle gültig. Für eine 2-dim-arr ist nur 2 gültig. –

Antwort

11

char **strings Ist ein Zeiger auf einen Zeiger auf char. Es ist ein gültiger Typ, aber Sie können ihn nicht initialisieren, wenn Sie versuchen, dies zu tun.

char *strings[] ist ein Array von Zeigern zu char, und Ihre Initialisierung davon ist gültig.

char strings[][] ist ein Versuch, ein zweidimensionales Array zu erstellen, aber es ist falsch, weil Sie die Größe aller Dimensionen außer der äußersten angeben müssen (die äußerste Größe kann vom Initialisierer abgeleitet werden). So wäre dies gültig:

char strings[][4] = {"abc", "bca", "rat", "tar", "far"}; 
1

1) char ** Strings ist eine Deklaration eines Zeigers auf einen Zeiger, expecteds es eine Zuschreibung einer Zahl nicht ein Array von Strings.

2) versuchen, definieren die Größe in der []: char * strings [5] = {

....

3) wieder, definieren die Größe des Arrays, [x] [y] x mit = Anzahl der Elemente und y = Anzahl der Zeichen des größten Elements

2

C99 unterstützt zusammengesetzte Literale und somit können Sie einen Array-Initialisierer zuweisen. So Fall 1 ist auch in Ordnung mit:

char **strings = (char *[]) {"abc", "bca", "rat", "tar", "far"}; 

C99 Entwurf, 6.5.2.5, Verbindung Literale

Constraints

1 Der Typname einen Objekttyp oder ein Array angeben soll unbekannter Größe, aber kein Array-Typ variabler Länge.

2 Kein Initialisierer soll versuchen, einen Wert für ein Objekt anzugeben, das nicht ist und im gesamten unbenannten Objekt enthalten ist, das durch die Verbindung Literal angegeben wird.

3 Wenn die Verbindung tritt wörtliche außerhalb des Körpers einer Funktion, die Initialisiererliste besteht aus konstanten Ausdrücken