【问题标题】:Realloc consistently fails (in C)Realloc 始终失败(在 C 中)
【发布时间】: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-&gt;lines = realloc(block-&gt;lines, (block-&gt;nb_lines + 1) * sizeof(char*)); 中的realloc 失败,则在此后(直接或间接)使用block-&gt;lines 时会出现严重的内存泄漏和未定义行为。
  • strinsert(tmpPtr, ch, x); 是做什么的?使用char* tmpPtr = realloc(*linePtr, (strlen(*linePtr) + 1) * sizeof(char));,除非您之前在分配区域之外写入,否则您不会增加分配的内存,而是保持它不变或缩小它,因为字符串需要strlen(s)+1 字节(一个用于0 终止符)。

标签: c realloc


【解决方案1】:

问题似乎在于传递给realloc 的指针不是reallocmalloc 返回的指针。显示的代码中缺少几部分,以便能够确定地知道这一点。但是您应该验证 getLinePtr 正在返回一个“指向已分配指针的指针”(我并不是说这是一个好方法,但在显示的代码中就是这样使用它的)。

【讨论】:

    【解决方案2】:

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

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

    感谢 Daniel Fisher 的提示。

    【讨论】:

      猜你喜欢
      • 2013-09-19
      • 1970-01-01
      • 2016-01-21
      • 2016-08-22
      • 2016-11-22
      • 1970-01-01
      • 2014-08-04
      • 1970-01-01
      • 2012-08-20
      相关资源
      最近更新 更多