1

25 文字を追加した後、Realloc が一貫して失敗します。

エラー:

ld.so によって検出された矛盾: dl-minimal.c: 116: realloc: アサーション `ptr == alloc_last_block' が失敗しました!

char** linePtr = getLinePtr(block, y);
char* tmpPtr = realloc(*linePtr, (strlen(*linePtr) + 1) * sizeof(char));
if (tmpPtr != NULL) {
    *linePtr = tmpPtr;
    strinsert(tmpPtr, ch, x);
}

直前に変数をチェックすると、すべて問題ないようです。*linePtrは 24 文字の文字列を指し、24 をstrlen(*linePtr)返します。返されるアドレスreallocは常に同じです。

ハードコーディングされた数字がないため、同じ文字数の後に常に失敗する理由がわかりません。

*linePtr最初は 1 バイトでしたが、今のところ毎回 1 バイト余分に再割り当てしています。

編集:

char** getLinePtr(Block* block, int y)
{
    assert(y >= block->start && y <= block->start + block->nb_lines);

    if (y == block->start + block->nb_lines) {
        block->lines = realloc(block->lines, (block->nb_lines + 1) * sizeof(char*));
        *(block->lines + block->nb_lines) = malloc(sizeof(char));
        block->nb_lines++;
    }
    return block->lines + block->nb_lines - 1;
}

編集2:

コードを貼り付けることで、getLinePtr にバグがあることに気付きました。(y を使用して) 要求された行ではなく最後の行を返しますが、このバグには何も変更しないでください。そして、最初の行だけが使用されます。

4

2 に答える 2

3

問題は、渡されているポインターがまたはreallocによって返されたポインターではないことであると思われます。確かにそれを知ることができるように、示されたコードには欠けている部分がいくつかあります。ただし、「割り当てられたポインターへのポインター」を返すことを確認する必要があります (これが良い方法だと言っているわけではありませんが、表示されているコードで使用されている方法です)。reallocmallocgetLinePtr

于 2012-09-18T20:45:20.240 に答える
0

問題は、(strlen(*linePtr) + 1) ではなく (strlen(*linePtr) + 2) を再割り当てする必要があることでした。

strlen は、終端の null 文字を除いた文字列のサイズを返します。そのため、そのために 1 を追加する必要があり、その直後に追加されるキャラクターのために 1 を追加する必要があります。

ヒントをくれたダニエル・フィッシャーに感謝します。

于 2012-09-19T21:46:42.783 に答える