• 締切済み

ポインタ&mallocで困っています(C言語)

あるローカル関数内でポインタを宣言し、mallocで領域確保します。そのポインタをグローバルで宣言したポインタに渡します。そしてローカル関数を抜ける。 その後、他のローカル関数内で、そのグローバルなポインタを呼び出して、ポインタの実態を参照しているのですが、プログラムが進むうちにそのグローバルポインタの実態の一部が書き換わってしまいます。どういう原因が考えられるでしょうか?

みんなの回答

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

solaris 8 デバッガはdbxという前提です。 使用されているのが、このデバッガでない場合は、以下の文章は参考になりませんが・・・・ stop accessを使用します。 stop access モード アドレス[,サイズ] モードはr,w,x等があります。 アドレスは、直接番地を指定することもできます。 例 char data[256]のdata[8]が更新された時、停止する。 stop access w &data[8] 詳細はdbxのマニュアルを参照下さい

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

意図しないところで、プログラムがそのポインター又はポインターの示す先を破壊しています。通常、この現象が発生するのは、メモリの転送命令を使用した場合です。以下の命令で破壊する可能性があります。 memcpy(転送先のアドレスの誤り、転送サイズの誤り) strcpy,strncpy(転送先のアドレスの誤り、転送元が終端NULLになっていない) printf,sprintf,fprint(引数の数と書式が合っていない、引数と書式が合っていない) 等を再調査してみて下さい。 どの環境で実行されているかが判りませんが、通常はデバッガで「指定されたメモリの内容が変更された場合、そこで停止する」指示をすることができます。破壊されるメモリの場所が判っていれば、その指示を行うことによりどのステートメントで破壊しているかが調査出来ます。

taurus4
質問者

お礼

原因が分かりました。 配列を10万個しか宣言していなかったのに、10万以上の配列に値を入れた際に、書き換えられてしまっていました。 やはり、数が未定の値は、はじめにこのくらいだろうと、決め付けずにそのつどmallocをするべきでした。 単純なミスですみませんでした。

taurus4
質問者

補足

ありがとうございます。調べてみたいと思います。 それと、お聞きしたいのですが >破壊されるメモリの場所が判っていれば、その指示を行うことによりどのステートメントで破壊しているかが調査出来ます。 とありますが、どのように記述すればよいのでしょう? OSはSlarisというやつです。