• ベストアンサー

教えて下さい。

C言語初心者のものです。 以下のコーディングをして場合、システム的にはどんな風な動きになっているかを教えて頂きたいんですが。。 ((1)~(3)の答えは一緒です。(4)のみ異なりなす。) char char1[7] = "abcdefg"; char char2[7] = "hijklmn"; (1)strncpy( (char *) char2[0], (char *) &char1,1); printf("char1=%s \n",char1); printf("char2=%s \n",char2); (2)strncpy( (char *) char2[0], (char *) char1,1); printf("char1=%s \n",char1); printf("char2=%s \n",char2); (3)strncpy( (char *) char2[0], char1,1); printf("char1=%s \n",char1); printf("char2=%s \n",char2); (4)strncpy(&char2[0],&char1[0],1); printf("char1=%s \n",char1); printf("char2=%s \n",char2); --------------------------------------------- 出力内容 (1) char1=abcdefg char2=hijklmnabcdefg (2) char1=abcdefg char2=hijklmnabcdefg (3) char1=abcdefg char2=hijklmnabcdefg (4) char1=abcdefg char2=aijklmnabcdefg

質問者が選んだベストアンサー

  • ベストアンサー
  • ponkichiz
  • ベストアンサー率50% (33/65)
回答No.4

>(1)と(4)は同じ結果になるのはわかるんですが、 >(2)と(3)に関してはあんまり納得できません。 >偶然同じ結果になってるんでしょうか? 偶然ではありません、(1)~(4)まで全て同じ値を 引数として渡しているため同じ結果になっています。 以下に配列変数の記述の仕方による 値の取り方の違いを説明します。 記述   値 char1  配列の先頭アドレス     (ポインタの持つサイズ情報が1) char[0] 配列の先頭要素"a" &char[0] 配列の先頭アドレス     (ポインタの持つサイズ情報が1) &char  配列の先頭アドレス      (ポインタの持つサイズ情報が7) となりますので >(1) >strncpy( (char *) &char2, (char *) &char1,7); >(2) >strncpy( (char *) &char2, (char *) char1,7); >(3) >strncpy( (char *) char2, char1,7); >(4) >strncpy(&char2[0],&char1[0],7); ここに記述されている物は全て 配列の先頭アドレスを渡していますので同じ結果になります。

morimorio
質問者

お礼

とても良くわかりました。 ありがとうございました。

その他の回答 (3)

  • ponkichiz
  • ベストアンサー率50% (33/65)
回答No.3

まず最初の配列定義から間違えています。 char char1[7] = "abcdefg"; char char2[7] = "hijklmn"; これは char char1[7+1] = "abcdefg"; char char2[7+1] = "hijklmn"; と書くべきです、 七文字の文字列をchar配列に格納する場合は最後に ヌル文字"\0"が入る分よけいに配列を確保しないと printfで正しく表示されません。 他の方も書いている通り(1)~(3)はバグでchar2の 配列対しては何のコピーもされません。

morimorio
質問者

補足

ご回答ありがとうございます。 とりあえず、以下のように修正し、 全て同じ結果となりました。 (1)と(4)は同じ結果になるのはわかるんですが、 (2)と(3)に関してはあんまり納得できません。 偶然同じ結果になってるんでしょうか? (1) strncpy( (char *) &char2, (char *) &char1,7); (2) strncpy( (char *) &char2, (char *) char1,7); (3) strncpy( (char *) char2, char1,7); (4) strncpy(&char2[0],&char1[0],7); 出力結果 -------------------------- char1=abcdefg char2=abcdefg

noname#6581
noname#6581
回答No.2

(1)~(3)の (char *) char2[0] はバグです。 これでは、char2の配列に文字列はコピーされません。 char2[0]に格納されている文字コードをポインタとして使用するので、全然関係ないメモリに文字列をコピーしてそこのメモリ内容を破壊してしまいます。

morimorio
質問者

お礼

ご指摘ありがとうございます。 とても参考になりました。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

(1)~(3)って、間違ってるんですけど・・・ なんで、動きがどうとかいう問題ではなく、メモリ破壊が起こっているんでしょう。 これ。 (char *) char2[0] charを無理やりchar*にキャストしてはいけません。 (char *)外すとコンパイルとおりませんよね。

morimorio
質問者

お礼

ご指摘ありがとうございます。

関連するQ&A