-1

strcpyについてお聞きしたいです。ここで問題が発生しました。これが私のコードです:

char *string1 = "Sentence 1";
char *string2 = "A";

strcpy(string1, string2);

そこに私のコードに問題はないと思います。string1 と string2 の最初の文字のアドレスが関数に送信されますstrcpy。このコードに問題はないはずですよね?誰でも私がこの問題を解決するのを手伝ってくれるか、私に説明してください..

ありがとうございました。

4

3 に答える 3

2

問題があります。ポインタはそれぞれ、書き込みできないメモリを指しています。これらは、コンパイラがアプリケーションに組み込む定数を指しています。

書き込み可能なメモリにスペースを割り当てる必要があります(char string1[<size>];たとえば、スタック経由、またはヒープ経由char *string1 = malloc(<size>);)。必ず必要なバッファ スペースの量に置き換え、少なくとも NULL 終了のために余分なバイトを追加してください。場合は、後でmalloc()確認してください。free()

于 2012-04-03T14:21:54.883 に答える
1

これにより、未定義の動作が発生します。コンパイラは歴史の癖のためにそれを許可するかもしれませんが(文字列リテラルはそうではありませんconst)、基本的に多くのプラットフォームで単に変更できないデータを上書きしようとしています。

于 2012-04-03T14:22:08.523 に答える
0

Linux のマニュアルページから:

char *strcpy(char *dest, const char *src); strcpy() 関数は、src が指す文字列を、終端のヌル バイト ('\0') を含めて、dest が指すバッファにコピーします。文字列は重複してはならず、宛先文字列 dest はコピーを受け取るのに十分な大きさでなければなりません。

*dest ポインターは、割り当てられた変更可能なメモリではなく文字列リテラルを指しているため、問題があります。文字列 1 を として定義するchar string1[BUFFER_LENGTH];か、 で動的に割り当ててみてくださいmalloc()

于 2012-04-03T14:26:03.120 に答える