Cで文字列の配列をchar **に直接代入するとエラーになる理由
C言語で文字列
の配列(文字
の配列ではない)をchar **に直接代入しようとするとコンパイル時に警告が表示されるのですが、
charポインタの配列を作り、そこに文字列
の配列を代入した後で、charポインタをchar **に代入すると警告が表示されません。
この違いは何が原因なのでしょうか?
#include <stdio.h>
int main() {
char *p_arr[] = {"XXXX", "DDDD"}; // ポインタの配列に文字列の配列を代入
char **p2; // charポインタのポインタを宣言
p2 = p_arr;
printf("%s\n", p2[0]); // 警告なし
char **p3 = {"XXXX", "DDDD"}; //ポインタのポインタに文字列の配列を直接代入する (警告あり)
printf("p3[0] = %s\n", p3[0]);
}
警告の内容:
p2.c:9:18: warning: incompatible pointer types initializing 'char **' with an expression of type 'char [5]' [-Wincompatible-pointer-types]
char **p3 = {"XXXX", "DDDD"};
^~~~~~
p2.c:9:26: warning: excess elements in scalar initializer
char **p3 = {"XXXX", "DDDD"};
^~~~~~