• 締切済み

以下のプログラムで出力が*adrs=9,0となるのはなぜでしょうか?

以下のプログラムで出力が*adrs=9,0となるのはなぜでしょうか? for(adrs=(unsigned long *)0x1100;adrs<(unsigned long *)0x1200;adrs++){   sprintf(log_buff1,"*adrs=%d,%x",*adrs,adrs);   gotoxy(0, 0);   printf(log_buff1);   delay(50); }

みんなの回答

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

向こうでも指摘されていますが、 質問する時は環境を詳しく書きましょう。 アドレスの代入とかである程度組み込みという事は 察しはつきますが、組み込みならばそれこそ、 環境が特定できないのですから。。。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

int と long の大きさが違う可能性があります. %d は int, %x は unsigned int に対する変換指定です. 一方, 実際に渡している *adrs は unsigned long です. ということで, long と int の大きさが違うと「%d で *adrs の前半だか後半だかを, %x で残りを変換する」ということがありえます. ちなみに 0x00001100 にする必要性は全くないと思うのだが>#2.

  • crew21
  • ベストアンサー率26% (58/222)
回答No.2

このプログラムは全体の中からの抜粋なのかもしれんけど、それはわからないからこのプログラムだけから言うと、 いきなり即値(0x1100)でポインタを初期化するもんじゃないよ。(何かよほど根拠があれば別だけどね) その場所(0x1100が指す場所)に何があるかわからないんだよ。 adrsの指す場所に 9,0 という文字列があったからそうなったんだよ。 もっと言うと、たまたまそこに 9,0 という文字列があって、その直後に運の良いことにNULLがあったからだと思うよ。 普通はそういうことはないから、訳の分からない命令を実行されて即死。 良くてもメモリ保護が働いて、プログラム実行中断だよ。 しかしコレ実行してよくプログラムがハングしなかっったね。 普通なら sprintf() の *adrs を評価した時点で即死だよ。(上に書いた理由により) それに unsigned long は4バイトなんだから、表現するなら 0x00001100 だよ。

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

ポインタの変換指定子は%xではなく%pのほうがいいです

関連するQ&A