• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ポインタについての質問です。)

ポインタとwrite関数の動作についての質問

このQ&Aのポイント
  • ポインタとwrite関数を使用して文字の表示を行おうとした結果、一部の出力が予想と異なった。
  • (1)の出力ではアドレスの大きい方から文字が出力されたが、(2)では文字の順番が逆になり、(3)では何も出力されなかった。
  • なぜ(2)の出力が予想と異なったのか、また(3)ではなぜ'1'が出力されなかったのか、それぞれの動作について説明してください。

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

  • ベストアンサー
回答No.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.でも書きましたが、「単体」を使用するから問題が出ます。 ポインタはあくまでも、別に確保されている変数のあるメモリアドレスを示すだけです。 それが配列なのか、単体なのかは気にしません。 本当に使用してよいのかについては作成者が気にする必要があります。

MIRS
質問者

お礼

ありがとうございました。 例1の方法で行ったところこちらの思うように出力することができました。

その他の回答 (4)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

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になると思われます。

MIRS
質問者

補足

a = '1'; b = '2'; c = '3'; str0 = &c; を実行したところ321とはならず3�>となってしまいました。 たまたま変数c,b,aが連続したアドレスに格納されていたということですが、今回のように連続したアドレスを使用した場合にはどのように宣言を行えば良いのでしょうか。

回答No.3

途中をはしょらず、すべてのソースを開示してください。 少なくとも、仮にfdが正常オープンしただけのファイルポインタであれば、(1)の結果は不定状態です。 >char *str0; は実態のないポインタのため、 >str0 = &a; の様に、実態を持つアドレスを格納するところまでは問題はありませんが、 a,b,cともに配列ではありません。 従って、 >str0++; を実行した時点で存在しない、もしくは他で使用している領域にアクセスしているためバグが発生しています。

  • f272
  • ベストアンサー率46% (8469/18132)
回答No.2

(1)ではアドレスの大きい方から出力されているのに対し といっているが、そう思ったのはどうして?

MIRS
質問者

お礼

すみません。見づらくなってしまいました。 アドレスnにaのアドレスが格納されている。 という意味です。

MIRS
質問者

補足

str0++; でアドレスが大きくなっている。 と考えた為です。 アドレスn - a アドレスn+1 - b アドレスn+2 - c と考えました。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

提示されたソースにはfdの定義がありません。コンパイルエラーが出ます。 プログラムの動きについて質問する際は、 回答しようとする側で何も手を加えなくてもいいように、 お手持ちのソースをそっくりそのままコピー&ペーストすることを おすすめします。

MIRS
質問者

補足

fd = open(/dev/ttyS0, O_RDWR); と記述しシリアルポートの解放を行っています。

関連するQ&A