2011-11-09 3 views
8

this questionを読んでいる間、GCCの入力をテストして、どのようなエラーが出力されるのかを確認したいと思っていました。私の驚きに、次の行:Cでは、1つの要素のみが特別に扱われる配列初期化ですか?

char array[] = {"s"}; 

"s\0"を含むサイズ2の配列で、その結果、エラーや警告なしでコンパイルします。式の右辺がタイプchar*[]であるため、コンパイラエラーが予想されます。

この場合、1つの要素しか配列として扱われない配列の初期化は何ですか?なぜですか?

答えて

6
char array[] = {"s"}; 

は同じである: "s" は文字列リテラルであるため、ここで

char array[] = "s"; 

{ }は、この場合にはオプションです。

あるいは、この場合

char array[] = {'s', '\0'}; 

{ }は、配列を初期化するために必要です。

+4

特にCでは{}を使って実際にスカラーを初期化することができます。ただし、アラインメントに影響があるかどうかは疑問です。いいえ..アラインメントには何の影響もありません:) –

+0

OK。だから私はこのケースでは全体の表現を考慮する必要があるだけでなく、左側ですか?例えば ​​'char配列* [] = {" s "};'は有効ですが 'char配列* [] =" s ";'そうではありません。 – Antoine

+0

char配列はどうですか* [] = {"s"};有効ですか?それは構文エラーです –

-10

正しく初期化文字列は次のとおりです。

char array[] = "something"; 

その10 char型の配列。

しかし、あなたが書いた場合:

`char* array = "something";` 

`それは別のオブジェクトである、あなたは、配列の内容を変更することはできません。

と:

char* array[] 

は文字列ではありません。

これは、charポインタ(char *)の配列です。あなたは

EXP *各文字のためにメモリを割り当てる必要があります。

char* array[3]; 
array[0] = malloc (10*sizeof(char)); 
strcpy(array[0] , "hello"); 

しかし、あなたが直接行うことができないのchar *の配列を、持っている:

char* array[3]; 
array[0] = "hello"; 

でもない:

char* array[] = {"first","second","other one","last"}; 

このinitでは、文字列を変更できません。

私が書いていることを言っている人はtotalyが間違っています。char *がメモリ割り当てを必要としていることを知っていますか?

なぜ-6以上ですか?

関連する問題