Будь ласка, подивіться на наступний код. Він намагається передати масив як char**a функції:
#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**?