Si prega di dare un'occhiata al seguente codice. Prova a passare un array come char**a una funzione:
#include <stdio.h>
#include <stdlib.h>
static void printchar(char **x)
{
printf("Test: %c\n", (*x)[0]);
}
int main(int argc, char *argv[])
{
char test[256];
char *test2 = malloc(256);
test[0] = 'B';
test2[0] = 'A';
printchar(&test2); // works
printchar((char **) &test); // crashes because *x in printchar() has an invalid pointer
free(test2);
return 0;
}
Il fatto che riesca a farlo compilare esplicitamente eseguendo il casting &test2su char**già suggerisce che questo codice è sbagliato.
Tuttavia, mi chiedo cosa ci sia esattamente di sbagliato in questo. Posso passare un puntatore a un puntatore a un array allocato dinamicamente ma non riesco a passare un puntatore a un puntatore per un array nello stack. Certo, posso facilmente aggirare il problema assegnando prima l'array a una variabile temporanea, in questo modo:
char test[256];
char *tmp = test;
test[0] = 'B';
printchar(&tmp);
Eppure, qualcuno può spiegare a me perché non funziona a getto char[256]a char**direttamente?
char (*)[256]achar**?