¿Invoca el código siguiente comportamiento no definido (debido a una violación de aliasing o de otro modo)?Aliasing del puntero de matriz: ¿comportamiento indefinido?
int foo(int (*a)[10], int (*b)[5])
{
(*a)[5]++;
return (*b)[0];
}
int x[10];
foo(&x, (int (*)[5])&x[5]);
Tenga en cuenta que el código correspondiente usando lisos tipos int *
en lugar de un triple a matriz sería perfectamente legal, porque a
y b
habría punteros al mismo tipo y por lo tanto permite a alias entre sí.
Editar: La consecuencia interesante, si esto es de hecho una violación aliasing, es que parece ser una forma hacker pero válida para obtener restrict
semántica pre-C99. Como en:
void some_func(int *aa, int *bb)
{
int (*a)[1] = (void *)aa;
int (*b)[2] = (void *)bb;
/* Now **a and **b can be assumed by the compiler not to alias */
}
Es de suponer que si necesita acceder a una gran variedad real en cada dirección, se puede usar SIZE_MAX-1 y SIZE_MAX-2, etc., como los tamaños diferentes.
Son punteros del mismo tipo, no se puede suponer que no alias. –