2011-10-20 7 views
8

Ho il seguente codice:stringa di conversione serie

char *array1[3] = 
{ 
    "hello", 
    "world", 
    "there." 
}; 

struct locator_t 
{ 
    char **t; 
    int len; 
} locator[2] = 
{ 
    { 
     array1, 
     10 
    } 
}; 

Compila OK con "gcc -Wall -ansi -pedantic". Ma con un'altra toolchain (Rowley), si lamenta di

warning: initialization from incompatible pointer type 

sulla linea in cui si trova char ** t. È davvero questo codice illegale o è OK?

Grazie per tutta la risposta. Ora so dov'era il mio problema. Tuttavia, solleva una nuova domanda:

string array initialisation

+0

su quale linea appare il problema? –

+0

domanda modificata. – lang2

risposta

4

Sembra perfettamente legale per me; char *[3] decade a char **, quindi l'assegnazione dovrebbe essere valida.

Né GCC 4.4.5 né CLang 1.1 lamentano.

2

Anche se in pratica array1 dovrebbe decadere a un puntatore di tipo char **, il suo tipo reale è infatti char *[3], quindi l'avviso.

Per eliminare l'avviso, si potrebbe provare a lanciare in modo esplicito:

... 
(char **) array1; 
... 
1

array1 è (char *)[3], semanticamente diversa da char **, anche se nell'assegnazione dovrebbe essere messi degradato a una char **

-1

puntatori e array e compatibile solo portata statica. Nell'ambito globale, un puntatore e un array non sono gli stessi, mescolando i due si otterrà un comportamento indefinito. Quindi, a mio parere, l'avvertimento è corretto.

provare a mettere:

extern char *array1[3] = 
{ 
    "hello", 
    "world", 
    "there." 
}; 

in un modulo e:

extern char **array1; 

struct locator_t 
{ 
    char **t; 
    int len; 
} locator[2] = 
{ 
    { 
     array1, 
     10 
    } 
}; 

in un altro, compilare e collegamento. (Non l'ho provato ...) Mi aspetterei che le cose vadano storte ...

+0

Il primo modulo non viene compilato perché non è possibile dichiarare una variabile 'extern' e inizializzarla in un'unica istruzione. Se lo aggiusti, potresti ricevere errori del linker perché i tipi dichiarati non corrispondono. –

+0

Divertente, il mio primo modulo viene compilato con avvertenze ma i secondi non lo sono per la stessa ragione della domanda originale ... Quello era un lampo veloce che non funzionava, volevo sottolineare la differenza tra array e puntatori nell'ambito globale. –