4

Cで配列と文字列を初期化する方法を試していたところ、次のことがわかりました。

char *str = "ABCDE";

エラーや警告なしで文字列を完全に初期化しますが、

int *array = {1,2,3,4,5};

警告が表示され、最終的にコアがダンプされます。それは今本当に私を悩ませています.なぜこの種の宣言が文字に対して機能するのかを知りたいのですが、整数に対しては機能しません...

編集:gccコンパイラを使用しています。

4

2 に答える 2

7

これを行うことにより、intに対して機能します。

int array[] = {1,2,3,4,5};

またはこれ:

int *array = (int[]){1,2,3,4,5};

"string"文字列をインスタンス化するために必要なすべての情報(サイズ、タイプ)をコンパイラに伝えます(別名、NULLターミネータを持つバイト配列)。複合リテラル{}として宣言しない限り、ネイキッドはそうではありません。を追加すると、開始されたデータが int の配列であることをコンパイラに伝えます。ints[]

Nathan がコメントで指摘したように、2 つのステートメントには微妙な違いがあります。

1 つ目は、スタックに 5 つの int の配列を定義します。この配列は変更可能で、関数の最後まで存続します。

2 番目は、1) スタック上の 5 つの int の無名配列を定義します。2) スタック上の無名配列の最初の要素へのポインター「配列」を定義します。メモリはスタック上にあるため、ポインターは返されません。また、配列は文字列リテラルのように本質的に const ではありません。

編集:コメンテーターが指摘したように、キャストを複合リテラルに置き換えました。

于 2012-09-22T18:55:34.007 に答える
4

文字列リテラルは、charへのconstポインタに減衰します。これはCの配列{1,2,3,4,5}であり、減衰しません。したがって、次のように、Cで配列を作成するための構文を使用する必要があります。

int a[] = {1,2,3,4,5} ;

次に、それを指すことができます:

int a[] = {1,2,3,4,5} ;
int *p = a;

配列の名前は、配列または最初の要素のアドレスであるためです。お役に立てば幸いです。

于 2012-09-22T18:55:39.447 に答える