11

Richard Reese の新しい (2013 年 5 月) O'Reilly の本「Understanding and Using C Pointers」を読んでいましたが、87 ページにあるコードについて質問があります。

if (++length > maximumLength) {
    char *newBuffer = realloc (buffer, maximumLength += sizeIncrement);

    if (newBuffer == NULL) {
        free (buffer);
        return NULL;
    }

    currentPosition = newBuffer + (currentPosition - buffer);
    buffer = newBuffer;
}

変数の名前が自明であることを願っています。コンテキストが必要な場合は、この抜粋だけでなく、コード全体を提供するように編集します。

私の質問は行についてcurrentPosition = newBuffer + (currentPosition - buffer);です。私の理解でrealloc()は、新しい割り当てが成功すると、最初に割り当てられたメモリが解放されます。それが正しい場合、問題の行はダングリング ポインターを使用しています。その式の右側の と のbuffer両方は、解放されたメモリへのポインタです。currentPosition

私の本能は、これを書き直して、 を使用してダングリング ポインターを使用しないようにすることlengthです。これらの最後の 2 行を次のように置き換えます。

buffer = newBuffer;
currentPosition = buffer + length;

ただし、2 つのポインターはまだアドレスを保持しているため (ガベージではありますが)、記述されたコードはおそらく機能し、これら 2 つのアドレス間のオフセットは再割り当ての方法として引き続き計算できますcurrentPosition。では、私はこれについて不安を感じているだけのしつこいですか?

質問を一般化すると、ポインターがぶら下がっている場合、ポインターに含まれるアドレスを、オフセットの計算などの目的で使用しても安全ですか? ありがとう。

4

2 に答える 2