0

今日、free再割り当てされたポインタにしようとすると、プログラムがクラッシュして「セグメンテーション違反」が出力されることがわかりました。

realloc()配列のサイズを大きくし、古い配列と別の配列をマージするために、このポインター(配列)でAが呼び出されます。

さらにプログラムでは、free何らかのバッファ配列を作成し、他の2つの配列を追加して解放することなく、この問題を回避するにはどうすればよいでしょうか。

  1. PARTICLE: 構造
  2. newCount:古い配列のサイズと追加される配列の合計

コード:

group1->particleList = 
         (PARTICLE *) realloc(group1->particleList, newCount * sizeof(PARTICLE));
4

3 に答える 3

2

再割り当てされたポインターを解放しても問題はありません。valgrind と呼ばれるプログラムは、コードで何が起こっているかについての貴重な情報を提供します。

于 2012-05-08T20:39:30.867 に答える
1

「stdlib.h」を含めましたか?

や友達のリターンをキャストするreallocと、プロトタイプがないという問題を隠すことができます。古いコンパイラはそれを取得して を返し、それをポインター型intにキャストするintと、ダメージが発生します。

realloc他の人が言及しているように返される問題は、バッファ0を使用するときに障害になるべきではありませんが、はるかに早い時期です。free

于 2012-05-08T20:39:28.273 に答える
0

まず、結果をrealloc一時変数に代入してください。リクエストが失敗すると、reallocNULL が返され、既に割り当てたメモリのハンドルが失われます。

PARTICLE *tmp = realloc(group1->particleList, ...); // cast is unnecessary
if (tmp)
  group1->particlelist = tmp;
else
  /* handle realloc failure */

呼び出しgroup1->particleListの前に (おそらくマージ コードで)誤って上書きしていないことを確認してください。呼び出しfreeが失敗した場合に NULL で上書きされていたとしても、NULL 引数を処理できるはずです (基本的には何もしません)。 reallocfree

于 2012-05-08T20:37:18.763 に答える