Proszę spojrzeć na następujący kod. Próbuje przekazać tablicę jako char**funkcję:
#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;
}
Fakt, że mogę go skompilować tylko poprzez jawne rzutowanie &test2na char**już wskazane, że ten kod jest zły.
Mimo to zastanawiam się, co dokładnie jest w tym złego. Mogę przekazać wskaźnik do wskaźnika do dynamicznie przydzielonej tablicy, ale nie mogę przekazać wskaźnika do wskaźnika dla tablicy na stosie. Oczywiście mogę łatwo obejść ten problem, najpierw przypisując tablicę do zmiennej tymczasowej, na przykład:
char test[256];
char *tmp = test;
test[0] = 'B';
printchar(&tmp);
Ale czy ktoś może mi wyjaśnić, dlaczego nie char[256]można char**bezpośrednio przesyłać?
char (*)[256]dochar**?