0

strcpy関数が1つの文字列を葯にコピーするだけであることを発見しました。たとえば、プログラムに次のステートメントが含まれている場合:

char buffer[10];
----------
strcpy(buffer, "Dante");

文字列「Dante」は配列buffer[]に配置されます。文字列には終了null(\ 0)が含まれます。これは、全部で6文字がコピーされることを意味します。単純に言うだけでは同じ効果が得られないのはなぜだろうか。:

buffer = "Dante";

私が間違っていなければ、Cは文字列をBASICよりもはるかに配列のように扱います。

4

6 に答える 6

9

文字列はCのデータ型ではないため、「文字列」はchar*sです。したがって、文字列を割り当てようとすると、文字ではなくメモリアドレスをバッファにコピーするだけです。

このことを考慮:

char* buffer;

buffer = malloc(20);
buffer = "Dante";

なぜ魔法のように「ダンテ」をバッファに入れる必要があるのですか?

于 2011-05-27T03:47:15.943 に答える
3

Cの「配列」はメモリのチャンクだからです。割り当てるポインタはありません。


構文がそのようになっていない理由を尋ねている場合:まあ、長さが異なっていたらどうなるでしょうか?

于 2011-05-27T03:46:15.450 に答える
3

配列のアドレスは変更できません。他の意味では、あなたは考えることができます、

char buffer[20];

は、と同等のコンパイル時間です。

char* const buffer = (char*)malloc(20);

これで、bufferアドレスを変更できないため、次のような操作を実行できなくなります。

buffer = "Dante"; // error 'buffer' address is not modifiable
于 2011-05-27T04:03:20.780 に答える
2
  • char buffer[128];が宣言だった場合はbuffer、配列の最初の場所を参照するため、buffer = "Dante"は、配列に格納されているアドレスに文字列のアドレスを割り当てようとします。配列内のメモリアドレスの場所は読み取り専用であり、コンパイル時に静的に割り当てられます。buffer = "Dante"したがって、コンパイル時に修正された他の場所を指すアドレスの場所を変更しようとするため、実行できません。これらの場所を書き込むことはできません。

  • char *buffer;が宣言だった場合は、メモリブロックのスター付きチャンクを指すことができる型変数bufferへのポインタです。charしたがって、文字列buffer = "Dante"アドレスをbufferに入力すると、実行可能ファイルにコンパイルおよび保存される文字列の開始アドレスを指しているため、印刷時に文字列が表示されますしかし、これは好ましい方法ではありません。

  • char arr[] = "Dante";文字列「Dante」を書くことができるセクションに格納されるので.textarr[0] = 'K'このようなもの、つまり変更が可能です。

  • そうするとchar *arr = "Dante";、文字列「Dante」は、.rodata書き込み可能ではない、または同様の場所に格納されます。これは、文字列リテラルが標準に従って変更できないためです。

于 2011-05-27T05:45:25.580 に答える
2

と書くbufferと、配列の最初の要素へのポインタとして扱われます。もちろん、またはは*buffer最初buffer[0]の要素です。は単なるポインタであるためbuffer、そのような大量のデータを割り当てることはできません"Dante"

于 2011-05-27T03:48:26.417 に答える
2

buffer = "Dante"Cには「文字列」データ型がなく、配列のみであるため、これを行うことはできません。

今、あなたはしかしすることができます...

char buffer[10] = "Dante";

しかし、文字列の長さが不明な場合は、次のことができます...

char buffer[] = "Dante123456678";

ただし、初期化中のみ、つまり実行できません...

char buffer[];

buffer = "Dante";
于 2011-05-27T03:57:45.203 に答える