5

次のコードを検討してください。

char message[]="foo";

void main(void){
    message[] = "bar";
}

MPLAB IDE v8.63に構文エラーがあるのはなぜですか?文字配列の値を変更しようとしています。

4

5 に答える 5

12

宣言後にそのような文字配列を使用することはできません。文字配列に新しい値を割り当てたい場合は、次のようにできます。

strcpy(message, "bar");
于 2013-01-18T09:53:22.073 に答える
10

のような課題

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()のようなライブラリ関数を使用してください。

于 2013-01-18T09:53:34.247 に答える
1

char配列を宣言するときの初期化でのみこれを行うことができます

message[] = "bar";

あなたのコードではそれを行うことはできません

strcpyそれを変更するには、から使用できます<string.h>

strcpy(message, "bar");
于 2013-01-18T09:52:13.377 に答える
0
char message[]="foo";

このステートメントにより、コンパイラは 4 文字の変数のメモリ空間を作成します。このメモリ クラスタの開始アドレスは、 のポインタ値ですmessage。のアドレスmessageは変更できません。それが指すアドレスを変更することはできません。この場合、唯一の可能性は、 が指すデータを変更することmessageです。

char* message="foo"

このとき、ポインタのアドレスを格納するためにメモリが作成されるため、message実行中にポイントのアドレスが変化する可能性があります。その後、安全に行うことができますmessage="bar"

于 2013-01-18T10:43:12.803 に答える
0

このように文字配列を変更することはできません。文字配列の値を変更する場合は、単一の文字を変更して変更するか、使用できます

strcpy(message,"bar");
于 2013-01-18T10:04:18.523 に答える