Xin hãy xem đoạn mã sau. Nó cố gắng truyền một mảng như là char**
một hàm:
#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;
}
Thực tế là tôi chỉ có thể biên dịch nó bằng cách truyền một cách rõ ràng &test2
để char**
gợi ý rằng mã này là sai.
Tuy nhiên, tôi tự hỏi chính xác những gì sai về nó. Tôi có thể chuyển một con trỏ tới một con trỏ tới một mảng được phân bổ động nhưng tôi không thể chuyển một con trỏ tới một con trỏ cho một mảng trên ngăn xếp. Tất nhiên, tôi có thể dễ dàng giải quyết vấn đề bằng cách trước tiên gán mảng cho một biến tạm thời, như vậy:
char test[256];
char *tmp = test;
test[0] = 'B';
printchar(&tmp);
Tuy nhiên, có thể ai đó giải thích cho tôi lý do tại sao nó không hoạt động để cast char[256]
để char**
trực tiếp?
char (*)[256]
đểchar**
?