0

自分で作ってみましたstrcpy。それはうまくいくはずです.誰かの投稿から(ほぼ正確なコード)をコピーして貼り付けました strcpy. どちらも「セグメンテーション違反」になります。

char* strcpy(char * destination, const char * source)
{
    while( (*destination++ = *source++) != '\0' ) 
        ;
    return destination;
}

このコードの何が問題になっていますか?

char* a = "hello";
cout << strcpy(a, "Haha") << endl;
4

4 に答える 4

6

文字列リテラルを上書きしようとしています。これにより、未定義の動作が発生します。a代わりに配列として宣言します。

char a[] = "hello";

あなたのstrcpy実装にもバグがあります (通常のセマンティクスを前提としています)。末尾ではなく、宛先バッファーの先頭へのポインターを返す必要があります。

于 2013-05-21T18:33:51.663 に答える
4

そこに保存されているため、データセグメントに書き込もうとして"hello"います。

したがって、呼び出すstrcpyと、セグメンテーション違反が発生します。

試す:

char a[] = "hello";
cout << strcpy(a, "Haha") << endl;

代わりは。

編集:strcpy関数内では、コピー後にdestination文字列の末尾を指すため、代わりに文字列の先頭を返す必要があります。

于 2013-05-21T18:34:12.157 に答える
3

文字列リテラルに関する上記および以下のすべてに加えて、文字列のENDへのポインターも返すため、セグメンテーション違反を回避したとしても、"" が出力されます。

于 2013-05-21T18:35:36.123 に答える
3

a文字列リテラルへのポインタです。

char* a = "hello";

文字列リテラルを変更しようとすると、未定義の動作になります。Carl が提案したように、代わりに文字列リテラルで配列を初期化すると機能します。

char a[] = "hello" ;
于 2013-05-21T18:33:33.397 に答える