Realloc始终失败(在C中)

时间:2012-09-18 20:40:31

标签: c realloc

添加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个字符的字符串,strlen(*linePtr)返回24. realloc返回的地址始终相同。

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

*linePtr在开头只有一个字节,我现在每次重新分配一个额外的字节。

编辑:

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;
}

EDIT2:

通过粘贴代码,我发现getLinePtr中存在一个错误:它返回最后一行而不是一个问题(使用y),但它不应该改变任何错误。并且只使用第一行。

1 个答案:

答案 0 :(得分:0)

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

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

感谢Daniel Fisher的暗示。