- ベストアンサー
ポインタとwrite関数の動作についての質問
- ポインタとwrite関数を使用して文字の表示を行おうとした結果、一部の出力が予想と異なった。
- (1)の出力ではアドレスの大きい方から文字が出力されたが、(2)では文字の順番が逆になり、(3)では何も出力されなかった。
- なぜ(2)の出力が予想と異なったのか、また(3)ではなぜ'1'が出力されなかったのか、それぞれの動作について説明してください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No.3です。 >a = '1'; >b = '2'; >c = '3'; >str0 = &c; >を実行したところ321とはならず3�>となってしまいました。 No.4氏の回答と違うことを心配しているのかもしれませんが、 あくまでも質問のソースと結果から推測した結果として、理屈的にはそうなるとの回答です。 変数宣言によるメモリ配置は一定ではありません。従ってどのような結果になるかは不定です。 >たまたま変数c,b,aが連続したアドレスに格納されていたということですが、 >今回のように連続したアドレスを使用した場合にはどのように宣言を行えば良いのでしょうか。 例1) char buff[20]; char *ptr; ptr = buff; buff[0] = '1'; buff[1] = '2'; buff[2] = '3'; buff[3] = '\0'; printf( "%s", ptr ); --------------------- 例2) char buff[20]; char *ptr; ptr = buff; *ptr = '1'; ptr++; *ptr = '2'; ptr++; *ptr = '3'; ptr++; *ptr = '\0'; printf( "%s", buff ); 3.でも書きましたが、「単体」を使用するから問題が出ます。 ポインタはあくまでも、別に確保されている変数のあるメモリアドレスを示すだけです。 それが配列なのか、単体なのかは気にしません。 本当に使用してよいのかについては作成者が気にする必要があります。
その他の回答 (4)
- php504
- ベストアンサー率42% (926/2160)
str0 = &a; a = '1'; str0++; str0 = &b; b = '2'; str0++; str0 = &c; c = '3'; これは a = '1'; b = '2'; c = '3'; str0 = &c; と同じことです。この他のstr0への代入は何の効果ももたらしていません。 321と表示されたのはたまたま変数c,b,aが連続したアドレスに格納されていたからでしょう。 変数の宣言を char a,b,dummy1='A',dummy2='B',c; にしたら(1)の結果は3BAになると思われます。
補足
a = '1'; b = '2'; c = '3'; str0 = &c; を実行したところ321とはならず3�>となってしまいました。 たまたま変数c,b,aが連続したアドレスに格納されていたということですが、今回のように連続したアドレスを使用した場合にはどのように宣言を行えば良いのでしょうか。
- SilverThaw
- ベストアンサー率32% (260/806)
途中をはしょらず、すべてのソースを開示してください。 少なくとも、仮にfdが正常オープンしただけのファイルポインタであれば、(1)の結果は不定状態です。 >char *str0; は実態のないポインタのため、 >str0 = &a; の様に、実態を持つアドレスを格納するところまでは問題はありませんが、 a,b,cともに配列ではありません。 従って、 >str0++; を実行した時点で存在しない、もしくは他で使用している領域にアクセスしているためバグが発生しています。
- f272
- ベストアンサー率46% (8469/18132)
(1)ではアドレスの大きい方から出力されているのに対し といっているが、そう思ったのはどうして?
お礼
すみません。見づらくなってしまいました。 アドレスnにaのアドレスが格納されている。 という意味です。
補足
str0++; でアドレスが大きくなっている。 と考えた為です。 アドレスn - a アドレスn+1 - b アドレスn+2 - c と考えました。
- asuncion
- ベストアンサー率33% (2127/6289)
提示されたソースにはfdの定義がありません。コンパイルエラーが出ます。 プログラムの動きについて質問する際は、 回答しようとする側で何も手を加えなくてもいいように、 お手持ちのソースをそっくりそのままコピー&ペーストすることを おすすめします。
補足
fd = open(/dev/ttyS0, O_RDWR); と記述しシリアルポートの解放を行っています。
お礼
ありがとうございました。 例1の方法で行ったところこちらの思うように出力することができました。