1. ホーム
  2. c

[解決済み] Cプログラムのstrcatが動作しない

2022-02-14 07:32:03

質問

#include<string.h>
#include<stdio.h>
void main()
{
    char *str1="hello";
    char *str2="world";
    strcat(str2,str1);
    printf("%s",str2);
}

このプログラムを実行すると、ランタイム・プログラム・ターミネーションが発生するんだけど。

よろしくお願いします。

これを使うと

char str1[]="hello";
char str2[]="world";

であれば、うまくいっていることになります。

しかし、なぜ

char *str1="hello";
char *str2="world";

このコードは動作しないのでしょうか?

どうすればいいですか?

あなたは悪い本から学んでいるのです。main関数は次のように宣言する必要があります。

int main (void);

voidと宣言すると、アプリケーションが終了したときに未定義の動作が発生します。まあ、まだ終了していませんが、いずれは終了するでしょう。

C言語の本を買ってきてください。そうすれば、次のことがわかるでしょう。

char *srt1="hello";

を書いたようにコンパイルされます。

static const char secret_array [6] = { 'h', 'e', 'l', 'l', 'o', 0 };
char* srt1 = (char*) &secret_array [0];

の間に

char srt1[]="hello";

を書いたようにコンパイルされます。

char srt1 [6] = { 'h', 'e', 'l', 'l', 'o', 0 };

strcatの呼び出し先は、結果を格納するのに十分なメモリを持っていないので、どちらの呼び出しも深刻なバグです。最初の呼び出しも、定数メモリを変更しようとするので、バグである。最初のケースでは、このバグはクラッシュにつながり、それは良いことであり、幸運なことである。2番目のケースでは、バグがすぐに検出されません。これは幸運なことです。このようなコードを顧客に出荷するプログラムに使用すると、運が良ければクラッシュし、そうでなければ顧客に多額の損失を与え、訴えられるような間違った結果につながることは間違いないでしょう。