- ベストアンサー
文字列のコピーについて
下記<コード1>と<コード2>はどちらも同じに思えますが、実際には<コード2>は”不正な処理”で終了してしまいます。 いろいろ考えたのですが、どうしても違いが理解できません。 理由がお分かりの方お願いいたします。 <コード1> char *str_copy(char *d , const char *s){ char *t=d; while(*d++=*s++) ; return (t); } int main(void) { char s1[128]="ABCD"; char s2[128]="EFGH"; str_copy(s2,s1); <コード2> char *str_copy(char *d , const char *s){ char *t=d; while(*d++=*s++) //不正な処理 ; return (t); } int main(void) { char s1[128]="ABCD"; char *ptr ="EFGH"; str_copy(ptr,s1);
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ここのサイト見ればmk1234さんの 疑問解消できると思いますよ。
その他の回答 (3)
- gimmick
- ベストアンサー率49% (134/270)
>コード1もコード2も同じことをやっていると思うのですが・・ (1)char s2[128]="EFGH";は char s2[128]; s2[0] = 'E'; s2[1] = 'F'; s2[2] = 'G'; s2[3] = 'H'; s2[4] = '\0'; とほぼ同じ。s2[128]は書き換え可能な領域に配置される。(コード1の場合は多分スタック) (2)char *ptr ="EFGH";の場合は"EFGH"というデータの置かれた5バイトの領域へのポインタがptrに代入される。(ヌル文字分をあわせると5バイトになる) 一般的にはこのデータ領域は書き換え禁止である。 これだけ書けば理解してもらえますか?
お礼
回答ありがとうございます (1)の場合は、書き込み可能領域に配置される (2)の場合は、書き込み不可領域に配置される ということであれば、非常に良く判ります。 (でもどうしてそうなるの?という疑問は残りますが、そういう風に定義されているとして納得します。) もしかして、 char s1[128]="○○○"; ←○○○は文字列 char *ptr ="○○○"; ←○○○は文字列リテラル ということでしょうか? そうだったら、もっと良く理解できるのですが。
- jmh
- ベストアンサー率23% (71/304)
ptr[] には書いちゃダメです。 参考 URL は、「文字列リテラルを変更」を google で検索したら出てきました。
お礼
回答ありがとうございます。 教えていただいたサイトを見ましたが”文字列リテラルを変更する”という意味が分かりません。 コード1もコード2も同じことをやっていると思うのですが・・・ ”文字列の内容の変更”と”文字列リテラルの変更”の違いが理解できません。
- taknt
- ベストアンサー率19% (1556/7783)
多分、ポイントptrの領域を確保していないから エラーになるのではないのでしょうか?
お礼
回答ありがとうございます。 下記にて、少なくとも4文字文の領域が確保できていると 考えてはいけないのでしょうか? char *ptr ="EFGH";
お礼
回答ありがとうございました。 大変良く判りました。 と言う事は、配列で宣言した文字列は、文字列リテラルとは呼ばないということなのでしょうか??? <理解内容> 1.ポインタが指している先は、文字列リテラル 2.文字列リテラルは無条件にconst修飾子がついているものと見なされます 3.文字列リテラルの実体は無条件に「静的記憶領域」に置かれます 4.静的でconstなものは呼び出し専用メモリ(ROM)領域に置かれます 5.書き込もうとすると無視するのではなく、コアを吐き、実行を強制的に中断