4
char myArray[6]="Hello"; //declaring and initializing char array

printf("\n%s", myArray); //prints Hello
myArray="World";  //Compiler says"Error expression must a modifiable lvalue

myArray を後で変更できないのはなぜですか? const 修飾子として宣言しませんでした。

4

7 に答える 7

6

書き込むchar myArray[6]="Hello";ときは、スタックに 6 を割り当てcharています (null ターミネータを含む)。

はい、個々の要素を変更できます。たとえば、 myArray[4] = '\0' は文字列を "Hell" に変換します (C ライブラリの文字列関数に関する限り) が、配列自体を再定義することはできません。スタックが台無しになるからです。

[const] char* myArray = "Hello";これはまったく異なる獣であることに注意してください。これは読み取り専用メモリであり、その文字列への変更は未定義の動作です。

于 2013-07-02T07:06:12.353 に答える
4

配列は変更不可能な左辺値です。したがって、それを変更することはできません。
配列の内容を変更する場合は、 を使用しますstrcpy

于 2013-07-02T07:06:00.273 に答える
3

配列の名前は変更できないため、次を使用してstrcpyください。

strcpy(myArray, "World");
于 2013-07-02T07:07:03.407 に答える
2

WellmyArrayは、変更できない配列の名前です。それに値を割り当てることは違法です。C の配列は変更不可lvaluesです。C には、配列自体を変更できる操作はありません (変更できるのは個々の要素のみです)。

ウェルmyArrayのサイズは 6strcpyです。 strcpy(myArray,"World")ソースの文字列の長さが宛先の文字列の長さ (この場合は 6) より大きい場合、オーバーフローが発生するためです。

C の配列は変更不可能な左辺値です。C には、配列自体を変更できる操作はありません (変更できるのは個々の要素のみです)。可能で安全な方法は

char *ptr = "Hello";

変更したい場合

 ptr = strdup("World");

ノート:

そうfree(ptr)しないと、メモリリークが発生する可能性があります。

于 2013-07-02T07:04:34.193 に答える
2

配列に代入することはできません (宣言で初期化する場合を除きます。代わりに、配列にコピーする必要があります。これはstrcpy.

ただし、5 文字を超える文字を配列にコピーしないように注意してください。これが格納できる最長の文字列だからです。また、ソース文字列が長すぎるとstrncpy終了文字が追加されない可能性があるため、この場合の使用は危険な場合があります。'\0'

于 2013-07-02T07:05:43.343 に答える
2

C ではネイキッド配列を割り当てることはできません。ただし、ポインターを割り当てることはできます。

char const *myPtr = "Hello";
myPtr = "World";

または、配列の要素に代入できます。

char myArray[6] = "Hello";
myArray[0] = 'W';
strcpy(myArray, "World");
于 2013-07-02T07:07:01.107 に答える
2

初期化以外では、C の変数に文字列を割り当てることはできません。C で文字列変数の値を変更するには、strcpy() 関数を使用します。

于 2013-07-02T07:08:12.423 に答える