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 修飾子として宣言しませんでした。
書き込むchar myArray[6]="Hello";
ときは、スタックに 6 を割り当てchar
ています (null ターミネータを含む)。
はい、個々の要素を変更できます。たとえば、 myArray[4] = '\0' は文字列を "Hell" に変換します (C ライブラリの文字列関数に関する限り) が、配列自体を再定義することはできません。スタックが台無しになるからです。
[const] char* myArray = "Hello";
これはまったく異なる獣であることに注意してください。これは読み取り専用メモリであり、その文字列への変更は未定義の動作です。
配列は変更不可能な左辺値です。したがって、それを変更することはできません。
配列の内容を変更する場合は、 を使用しますstrcpy
。
配列の名前は変更できないため、次を使用してstrcpy
ください。
strcpy(myArray, "World");
WellmyArray
は、変更できない配列の名前です。それに値を割り当てることは違法です。C の配列は変更不可lvalues
です。C には、配列自体を変更できる操作はありません (変更できるのは個々の要素のみです)。
ウェルmyArray
のサイズは 6strcpy
です。
strcpy(myArray,"World")
ソースの文字列の長さが宛先の文字列の長さ (この場合は 6) より大きい場合、オーバーフローが発生するためです。
C の配列は変更不可能な左辺値です。C には、配列自体を変更できる操作はありません (変更できるのは個々の要素のみです)。可能で安全な方法は
char *ptr = "Hello";
変更したい場合
ptr = strdup("World");
ノート:
そうfree(ptr)
しないと、メモリリークが発生する可能性があります。
配列に代入することはできません (宣言で初期化する場合を除きます。代わりに、配列にコピーする必要があります。これはstrcpy
.
ただし、5 文字を超える文字を配列にコピーしないように注意してください。これが格納できる最長の文字列だからです。また、ソース文字列が長すぎるとstrncpy
終了文字が追加されない可能性があるため、この場合の使用は危険な場合があります。'\0'
C ではネイキッド配列を割り当てることはできません。ただし、ポインターを割り当てることはできます。
char const *myPtr = "Hello";
myPtr = "World";
または、配列の要素に代入できます。
char myArray[6] = "Hello";
myArray[0] = 'W';
strcpy(myArray, "World");
初期化以外では、C の変数に文字列を割り当てることはできません。C で文字列変数の値を変更するには、strcpy() 関数を使用します。