知っている人には当たり前のことかもしれないけれど、デバッグで一度躓いたので。
メモリ容量が足りないからreallocをして容量を拡張しようとすると、なんとポインタの位置が変わってしまう。したがって、
のようなことをしてはいけない。pの中身を他の変数で参照していたら、reallocした瞬間に他の変数が参照している場所が不正な位置になって、下手するとメモリ破壊、アクセスバイオレーションエラーになる。
LPSTR p;
/*何か読み込み処理*/
if(/*バッファ不足*/)
{
p = realloc(p, MAX_SIZE);
}
また、reallocに失敗すればNULLが返ってくるから、pが参照しているアドレスが誰からも見えなくなってしまう。
とするべきだそうだ。
LPSTR p;
/*何か読み込み処理*/
if(/*バッファ不足*/)
{
LPSTR ptmp = realloc(p, MAX_SIZE);
if(!ptmp)
{
/*エラー処理*/
return;
}
p = ptmp;
}