Пожалуйста, взгляните на следующий код. Он пытается передать массив как char**функцию:
#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;
}
Тот факт, что я могу получить его только для компиляции, явно приведя &test2к char**уже намекам, что этот код неверен.
Тем не менее, мне интересно, что именно не так об этом. Я могу передать указатель на указатель на динамически размещенный массив, но не могу передать указатель на указатель для массива в стеке. Конечно, я легко могу обойти проблему, сначала назначив массив временной переменной, например так:
char test[256];
char *tmp = test;
test[0] = 'B';
printchar(&tmp);
Тем не менее, кто - то может объяснить мне , почему он не работает в гипсе , char[256]чтобы char**напрямую?
char (*)[256]вchar**?