1

文字列定数を次のように割り当てることがchar *できます。char [ ]

char *p = "hello";
char a[] = "hello"; 

string arrayの場合、当然、次のようになります。

char **p = {"hello", "world"};   //  Error
char *a[] = {"hello", "world"};

最初の方法では、コンパイル時に警告が生成されSegmentation fault、文字列定数を出力しようとすると警告が表示されますprintf("%s\n", p[0]);

なんで ?

4

4 に答える 4

2
char **p = {"hello", "world"};

ここで、pはポインターへのポインターであり、ポインターcharの配列を持つ配列初期化子で初期化することはできません (各文字列リテラルは初期化中にポインターに変換されます。C の文字列リテラルの実際の型は ですchar[n])。

タイプは互換性がありません。つまり、 p はタイプchar **で、RHS はタイプchar *[]です。したがって、診断はコンパイラによって発行されます。

一方、

char *a[] = {"hello", "world"};

aへのポインターの配列として有効でcharあり、型が一致します。したがって、これは有効な初期化です。


C99 以降、C 言語は複合リテラル (6.5.2.5、C99)をサポートしており、これを使用して初期化できます。

char **p = (char *[]) {"hello", "world"}; 

そのため、C99 以降がコンパイラでサポートされている場合は、複合リテラルを使用してください。それ以外の場合は、ポインターの配列の初期化 ( ) に固執しますchar *a[]

複合リテラルのさまざまな例については、こちら (gcc マニュアル) を参照してください。

于 2013-11-02T05:55:24.490 に答える
0

まず、char *p = "hello"とは異なりchar a[] = "hello"ます。

char *p = "hello"

"hello"実際にはリテラル定数へのポインタです。リテラル定数へのポインタを に代入しますp。なので、使ったほうがいいconst char *p = "hello"です。

char a[] = "hello"

の文字は末尾付きで"hello"配列にコピーされました。a'\0'

2番、

char *a[] 

ポインターの配列を定義するので、使用しても問題ありませんchar *a[] = {"hello", "world"};

char **p 

charへのポインターへのポインターを定義するため、使用しても意味がありませんchar **p = {"hello", "world"};

于 2013-11-02T05:56:18.197 に答える