- 締切済み
ポインタ&mallocで困っています(C言語)
あるローカル関数内でポインタを宣言し、mallocで領域確保します。そのポインタをグローバルで宣言したポインタに渡します。そしてローカル関数を抜ける。 その後、他のローカル関数内で、そのグローバルなポインタを呼び出して、ポインタの実態を参照しているのですが、プログラムが進むうちにそのグローバルポインタの実態の一部が書き換わってしまいます。どういう原因が考えられるでしょうか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- tatsu99
- ベストアンサー率52% (391/751)
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)
意図しないところで、プログラムがそのポインター又はポインターの示す先を破壊しています。通常、この現象が発生するのは、メモリの転送命令を使用した場合です。以下の命令で破壊する可能性があります。 memcpy(転送先のアドレスの誤り、転送サイズの誤り) strcpy,strncpy(転送先のアドレスの誤り、転送元が終端NULLになっていない) printf,sprintf,fprint(引数の数と書式が合っていない、引数と書式が合っていない) 等を再調査してみて下さい。 どの環境で実行されているかが判りませんが、通常はデバッガで「指定されたメモリの内容が変更された場合、そこで停止する」指示をすることができます。破壊されるメモリの場所が判っていれば、その指示を行うことによりどのステートメントで破壊しているかが調査出来ます。
お礼
原因が分かりました。 配列を10万個しか宣言していなかったのに、10万以上の配列に値を入れた際に、書き換えられてしまっていました。 やはり、数が未定の値は、はじめにこのくらいだろうと、決め付けずにそのつどmallocをするべきでした。 単純なミスですみませんでした。
補足
ありがとうございます。調べてみたいと思います。 それと、お聞きしたいのですが >破壊されるメモリの場所が判っていれば、その指示を行うことによりどのステートメントで破壊しているかが調査出来ます。 とありますが、どのように記述すればよいのでしょう? OSはSlarisというやつです。