2012-04-03 13 views
-1

strcpyについてお尋ねします。私はここで問題がある。ここに私のコードです:C - strcpyポインタ

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

strcpy(string1, string2); 

私のコードには問題はないと思います。 string1とstring2の最初の文字のアドレスは、関数strcpyに送られます。このコードには問題はありません。 誰でもこの問題を解決したり、私に説明してください。

ありがとう。

+2

文字列リテラルは変更できませんhttp://c-faq.com/strangeprob/strlitnomod.html – cnicutar

+0

文字列リテラル(「文章1」と「A」)は変更不可能です(未定義の振る舞い)char配列。そのような配列に 'strcpy()'を(信頼できる形で)置くことはできません。 – pmg

+0

char * string1を使用しても問題ありません。のみ?文字列のコピーを2回使用しますか? – kapilddit

答えて

2

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

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

+0

ありがとう!!これはなぜ 'string string2 [50]'が動作するのかを説明しています。私はポインタの初心者です、少しポインタを使用する方法を混乱。再度、感謝します。 – lucifer

1

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

0

するchar * strcpyの(CHAR * DEST、CONSTするchar * SRC); strcpy()関数は、終点ヌルバイト( '\ 0')を含む のsrcが指す文字列を、destによって指し示されたバッファ にコピーします。文字列は重複しないで、宛先文字列 destはコピーを受け取るのに十分な大きさでなければなりません。

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

関連する問題