【发布时间】:2012-09-18 20:40:31
【问题描述】:
添加 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),但它不应该对这个错误做出任何改变。并且只使用了第一行。
【问题讨论】:
-
旁注:您正在尽可能低效地进行重新分配。
-
getLinePtr()返回什么?它是如何构造返回值的? -
如果
block->lines = realloc(block->lines, (block->nb_lines + 1) * sizeof(char*));中的realloc失败,则在此后(直接或间接)使用block->lines时会出现严重的内存泄漏和未定义行为。 -
strinsert(tmpPtr, ch, x);是做什么的?使用char* tmpPtr = realloc(*linePtr, (strlen(*linePtr) + 1) * sizeof(char));,除非您之前在分配区域之外写入,否则您不会增加分配的内存,而是保持它不变或缩小它,因为字符串需要strlen(s)+1字节(一个用于0 终止符)。