- ベストアンサー
教えて下さい。
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
- みんなの回答 (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); ここに記述されている物は全て 配列の先頭アドレスを渡していますので同じ結果になります。
その他の回答 (3)
- ponkichiz
- ベストアンサー率50% (33/65)
まず最初の配列定義から間違えています。 char char1[7] = "abcdefg"; char char2[7] = "hijklmn"; これは char char1[7+1] = "abcdefg"; char char2[7+1] = "hijklmn"; と書くべきです、 七文字の文字列をchar配列に格納する場合は最後に ヌル文字"\0"が入る分よけいに配列を確保しないと printfで正しく表示されません。 他の方も書いている通り(1)~(3)はバグでchar2の 配列対しては何のコピーもされません。
補足
ご回答ありがとうございます。 とりあえず、以下のように修正し、 全て同じ結果となりました。 (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
(1)~(3)の (char *) char2[0] はバグです。 これでは、char2の配列に文字列はコピーされません。 char2[0]に格納されている文字コードをポインタとして使用するので、全然関係ないメモリに文字列をコピーしてそこのメモリ内容を破壊してしまいます。
お礼
ご指摘ありがとうございます。 とても参考になりました。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
(1)~(3)って、間違ってるんですけど・・・ なんで、動きがどうとかいう問題ではなく、メモリ破壊が起こっているんでしょう。 これ。 (char *) char2[0] charを無理やりchar*にキャストしてはいけません。 (char *)外すとコンパイルとおりませんよね。
お礼
ご指摘ありがとうございます。
お礼
とても良くわかりました。 ありがとうございました。