次のコードを検討してください。
char message[]="foo";
void main(void){
message[] = "bar";
}
MPLAB IDE v8.63に構文エラーがあるのはなぜですか?文字配列の値を変更しようとしています。
次のコードを検討してください。
char message[]="foo";
void main(void){
message[] = "bar";
}
MPLAB IDE v8.63に構文エラーがあるのはなぜですか?文字配列の値を変更しようとしています。
宣言後にそのような文字配列を使用することはできません。文字配列に新しい値を割り当てたい場合は、次のようにできます。
strcpy(message, "bar");
のような課題
message[] = "bar";
また
message = "bar";
C ではサポートされていません。
初期代入が機能する理由は、実際には代入を装った配列の初期化であるためです。コンパイラは解釈します
char message[]="foo";
なので
char message[4] = {'f', 'o', 'o', '\0'};
ここには実際には文字列リテラルは"foo"
含まれていません。
しかし、あなたがしようとすると
message = "bar";
「バー」は実際の文字列リテラルとして解釈され、それだけでmessage
なく、変更可能な左辺値ではありません。それに何かを割り当てることはできません。配列を変更する場合は、文字ごとに行う必要があります。
message[0] = 'b';
message[1] = 'a';
など、または(より良い)strcpy()のようなライブラリ関数を使用してください。
char配列を宣言するときの初期化でのみこれを行うことができます
message[] = "bar";
あなたのコードではそれを行うことはできません
strcpy
それを変更するには、から使用できます<string.h>
strcpy(message, "bar");
char message[]="foo";
このステートメントにより、コンパイラは 4 文字の変数のメモリ空間を作成します。このメモリ クラスタの開始アドレスは、 のポインタ値ですmessage
。のアドレスmessage
は変更できません。それが指すアドレスを変更することはできません。この場合、唯一の可能性は、 が指すデータを変更することmessage
です。
char* message="foo"
このとき、ポインタのアドレスを格納するためにメモリが作成されるため、message
実行中にポイントのアドレスが変化する可能性があります。その後、安全に行うことができますmessage="bar"
このように文字配列を変更することはできません。文字配列の値を変更する場合は、単一の文字を変更して変更するか、使用できます
strcpy(message,"bar");