Falla de SEG cuando se usa múltiples niveles de indirección
-
26-10-2019 - |
Pregunta
Al asignar y luego intentar acceder a una variedad de punteros a punteros:
void tester(char ***p)
{
int i;
char **pp;
pp = *p;
pp = calloc(10, sizeof(*pp));
for (i = 0; i < 10; i++)
printf("%d = %p\n", i, pp[i]);
*p = pp;
}
void tester_broken(char ***p)
{
int i;
*p = calloc(10, sizeof(**p));
for (i = 0; i < 10; i++)
printf("%d = %p\n", i, *p[i]);
}
int main(void)
{
char **a;
tester(&a);
tester_broken(&a);
return 0;
}
¿Alguien puede explicar por qué una de estas obras y las otras fallas de SEG?
Solución
Es un problema de precedencia. Probar:
void tester_fixed(char ***p)
{
int i;
*p = calloc(10, sizeof(**p));
for (i = 0; i < 10; i++)
printf("%d = %p\n", i, (*p)[i]);
}
El operador del soporte (suscripción de matriz) se une más a la que el operador de asterisco (desreferencia). Los paréntesis hacen que su intención explique.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow