2

重複の可能性:
Cのchars[]とchar*sの違いは何ですか?

int main()
{
    char *t1 = "Hi hello";
    char t2[] = " strcat";

    printf("%s", strcat(t1, t2));
}

このプログラムを実行すると、セグメンテーション違反が発生します

int main()
{
    char t1[] = "Hi hello";
    char *t2 = " strcat";

    printf("%s", strcat(t1, t2));
}

一方、次のプログラムを実行すると、正しく実行され、連結された文字列が表示されます。どうしてこんなことに ?

前もって感謝します :)

この質問の要約[解決済み]

この質問は非常に閉じています。要約を追加したかっただけです。私が理解したポイントは次のとおりです。この方法で宣言された変数の場合

char *t1 = "hi hello";  

型修飾子constを必ず追加してください。デフォルトでは読み取り専用メモリです。いかなる場合でも、データを変更することはできません。例えば

t1[0] = "L"; 

許可されていません。この方法で宣言された変数は、私たちの管理下にはなく、プログラムの存続期間中は永久に残ります。その記憶を解放することすらできません。

char t1[10] = "hi hello";

このようにして、メモリをより適切に制御できます。アレイを変更することは許可されています。スコープがなくなると、割り当てられたメモリの割り当てが解除されます。

char t1[] = "hi hello"; char t2[8] = "hi hello";

2つの宣言t1とt2は非常によく似ており、8文字の位置が順番に割り当てられています。

私が理にかなっていることを願っています。そうでない場合は編集してください。:)

4

4 に答える 4

5

t1読み取り専用の文字シーケンスへのポインタです。最初の引数が指す配列に書き込みstrcatたいのですが、これは未定義の動作です。

(2番目のバージョンも、アレイをオーバーランしているため、未定義の動作ですt1。)

于 2012-10-28T18:45:05.133 に答える
0

どちらのプログラムも間違っていますが、2番目のプログラムは改善される可能性があり、次のシーケンスのためにターゲット配列により多くのスペースが必要です。

char t1[100] = "Hi hello"; // at least 16 is needed for t1 + t2 - 100 is just example
char *t2 = " strcat";

以前の定義:

char t1[] = "Hi hello";

と同等です:

char t1[9] = "Hi hello";

また:

char t1[9] = {'H','i',' ','h','e','l','l','o','\0'};

9両方の弦を入れるのに十分なスペースがありません。

于 2012-10-28T18:47:35.797 に答える
0

呼び出しのターゲット配列は、strcat変更可能なメモリであり、結果を保持するのに十分な大きさである必要があります。

char *t1 = "Hi Hello";   // non-modifiable memory
char t2[16] = " strcat"; // large enough for result, including terminating '\0'
strcat(t2, t1);          // okay

私が正しく数えたと仮定して...

于 2012-10-28T18:49:38.387 に答える
0

実際、strcat()関数は、宛先文字列の後にソース文字列を追加します。そして、2番目の引数はソース文字列である必要があります。最初のサンプルを実行しているときはいつでも、t2文字列の後にt1文字列を追加しようとしています。ただし、t2文字列は固定サイズの配列であるため、サイズは固定されています(つまり、サイズを増やすことはできません)。

于 2012-10-28T18:49:42.963 に答える