2010-12-08 2 views
2

ポインタが割り当てられて親の呼び出し元/親関数に返されるCコードがここにあります。 GDBを使用して、ポインタの割り当ては問題ないことに気付きましたが、返すと、アドレスの最初の4バイトの上位ビットが失われます。基本的にはこのように書き:今Cポインタの問題:関数から返されたときにアドレス情報が失われる

allocate pointer A 
allocate pointer B 
Free A 
Return B 

、私はこれを変更する場合:

allocate pointer B 
allocate pointer A 
Free A 
Return B 

物事はうまく動作します。奇妙なことは、このコードが5年以上にわたって正常に機能していて、非常に特殊なケースでは私たちに問題を起こしているということです。私たちが心配しているのは、アドレスが変更されているということです.GDBを添付したときだけ、このエラーを検出することはできませんでした。

誰もが似たようなものを見たり、なぜこれが起こっているのか知っていますか?ちなみに、私たちはAまたはBで処理できる以上のものを書くつもりはないので、両方のバッファがデータの正しいサイズです。

ありがとうございました。

+9

これを検査するコードなしでこれに答えるのは難しいです。 –

+1

これはかなり曖昧です。 –

+1

あなたは 'ポインタを割り当てる 'ことはしません。ポインタによって参照されるデータを割り当てます。 –

答えて

3

あなたの機能のプロトタイプを宣言していないようなにおいがします。これは、32ビットマシン上では、intvoid*の幅が同じで、長年にわたり良好に機能しました。今日ではこれらは異なっており、高次のバイトが緩んでいます。

-Wallなどでコンパイルすると思いますか?

+0

答えてくれてありがとう、私はソースとコンパイラの指示をチェックします。 –

+0

この回答は古くても、ありがとう。 – Femaref

1

これは、多くの理由、バッファのオーバーフロー、ヒープスペースの制限などが原因である可能性があります。

0

これは、メモリ破損、すなわちランダムなアドレスへの書き込み、またはスタック上の割り当てられたオブジェクトまたはオブジェクトの終わりを過ぎているためです。

+0

私はオーバーフローを調査しているときにもそれについて疑問に思った。これまではかなり奇妙です。答えをありがとう。 –

関連する問題