โปรดดูรหัสต่อไปนี้ มันพยายามที่จะส่งผ่านอาร์เรย์เป็น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**
?