2013-10-23 31 views
5

Differenza tra queste dichiarazioni?Dichiarazione array di stringhe 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"}; 

solo (2) è una dichiarazione valida. Qual è la differenza tra questi tipi e perché i punti (1) e (3) non sono validi?

+3

Chi ha detto che solo il 2 è valido? –

+0

Se compilo e provo a stampare solo 2) funzionava. –

+0

Dipende da come si definisce valido. Come "dichiarazione valida", sono tutti validi. Per un 2 dim-arr, solo 2 è valido. –

risposta

11

char **strings È un puntatore a un puntatore a char. È un tipo valido, ma non è possibile inizializzarlo con un inizializzatore di array come si sta tentando di fare.

char *strings[] è una matrice di puntatori a char e l'inizializzazione di esso è valida.

char strings[][] è un tentativo di creare una matrice bidimensionale, ma è errato perché è necessario specificare la dimensione di tutte le dimensioni tranne quella più esterna (la dimensione più esterna può essere dedotta dall'inizializzatore). Quindi questo sarebbe valido:

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

1) char ** stringhe è una dichiarazione di un puntatore a un puntatore, si expecteds un'attribuzione di un numero non un array di stringhe.

2) provare definire le dimensioni all'interno []: char * stringhe [5] = {....

3) nuovamente, definire la dimensione della matrice, [x] [y] con x = numero di elementi y = numero di caratteri dell'elemento più grande

2

C99 supporta i valori letterali composti e quindi è possibile assegnare un inizializzatore di array. Quindi il caso 1 è anche bene con:

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

C99 progetto, 6.5.2.5, letterali composti

Vincoli

1 Il nome del tipo deve specificare un tipo di oggetto o un array di dimensioni sconosciute, ma non di tipo a lunghezza variabile.

2 Nessun inizializzatore tenta di fornire un valore per un oggetto non contenuto nell'intero oggetto senza nome specificato dal composto letterale.

3 Se il composto si verifica letterale di fuori del corpo di una funzione, la lista di inizializzazione è composta di espressioni costanti