次のコードを見てください。これは、配列をとして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**
ですか?