Pregunta

Tengo el siguiente código:

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

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

Se compila bien con "gcc -Wall -ansi -pedantic".Pero con otra cadena de herramientas (Rowley), se queja

warning: initialization from incompatible pointer type

en la línea donde se encuentra char ** t.¿Es este código realmente ilegal o está bien?

Gracias por toda la respuesta.Ahora sé dónde estaba mi problema.Sin embargo, plantea una nueva pregunta:

inicialización de matriz de cadenas

¿Fue útil?

Solución

Me parece perfectamente legal;char *[3] decae a char **, por lo que la asignación debería ser válida.

Ni GCC 4.4.5 ni CLang 1.1 se quejan.

Otros consejos

Aunque en la práctica array1 debería decaer a un puntero de tipo char **, su tipo real es de hecho char *[3], de ahí la advertencia.

Para suprimir la advertencia, puede intentar transmitirla explícitamente:

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

array1 es (char *)[3], que es semánticamente diferente de char **, aunque en la asignación debería ser degradado elegantemente a char **

Punteros y matrices y solo compatible en alcance estático.En el ámbito global, un puntero y una matriz no son lo mismo, mezclar los dos dará como resultado un comportamiento indefinido.Entonces, en mi opinión, la advertencia es correcta.

Intente poner:

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

en un módulo y:

extern char **array1;

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

en otro, compilar y vincular.(No lo he probado ...) Esperaría que las cosas salieran mal ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top