1

添加 25 个字符后,Realloc 始终失败。

错误:

ld.so 检测到的不一致:dl-minimal.c: 116: realloc: Assertion `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个字符的字符串,strlen(*linePtr)返回24。返回的地址realloc总是一样的。

没有硬编码的数字,所以我不知道为什么它总是在相同数量的字符后失败。

*linePtr是 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的指针不是reallocor返回的指针malloc。显示的代码中缺少几部分可以​​确定地知道这一点。但是您应该验证它getLinePtr正在返回一个“指向已分配指针的指针”(我并不是说这是一种很好的方法,但这就是它在所示代码中的使用方式)。

于 2012-09-18T20:45:20.240 回答
0

问题是我需要重新分配 (strlen(*linePtr) + 2) 而不是 (strlen(*linePtr) + 1)。

strlen 返回没有终止空字符的字符串的大小。所以我需要为它添加 1,并且我需要为要添加的字符添加 1。

感谢 Daniel Fisher 的提示。

于 2012-09-19T21:46:42.783 回答