considerar el siguiente código (que se produjo como resultado de this discussion):Equivalencia de p [0] y * p para los tipos de matriz incompletas
#include <stdio.h>
void foo(int (*p)[]) { // Argument has incomplete array type
printf("%d\n", (*p)[1]);
printf("%d\n", p[0][1]); // Line 5
}
int main(void) {
int a[] = { 5, 6, 7 };
foo(&a); // Line 10
}
GCC 4.3.4 complains con el mensaje de error:
prog.c: In function ‘foo’:
prog.c:5: error: invalid use of array with unspecified bounds
mensaje de error en el mismo GCC 4.1.2, y parece ser invariable de -std=c99
, -Wall
, -Wextra
.
No está contento con la expresión p[0]
, pero está contento con *p
, aunque estos deberían (en teoría) ser equivalentes. Si comento la línea 5, el código se compila y hace lo que yo esperaría (muestra 6
).
Es de suponer que una de las siguientes situaciones:
- Mi comprensión de la norma (s) C es incorrecta, y estas expresiones no son equivalente.
- GCC tiene un error.
Pondría mi dinero en (1).
Pregunta: ¿Alguien puede explicar este comportamiento?
Aclaración: Soy consciente de que esto se puede "resolver" especificando un tamaño de matriz en la definición de la función. Eso no es lo que me interesa
Para los puntos de "prima":. Alguien puede confirmar que MSVC 2010 está en un error cuando se rechaza la línea 10 con el siguiente mensaje?
1><snip>\prog.c(10): warning C4048: different array subscripts : 'int (*)[]' and 'int (*)[3]'
¿Desde cuándo es (* p) [] una expresión de tipo * array *, completa o no? –
@JohnBode: Bueno, si tuviéramos 'int (* p) [10]', entonces '(* p)' sería del tipo de matriz. Dado que no tenemos tamaño, creo que eso lo hace incompleto. –