【问题标题】:realloc function error: pointer being realloc'd was not allocatedrealloc 函数错误:未分配重新分配的指针
【发布时间】:2016-01-08 00:55:42
【问题描述】:

我试图在实现字符串组合函数时使用 realloc 函数。此函数将合并两个字符串,leftPiece 和 rightPiece,左段的尾部和右段的头部有重叠的字符,编号为 num_overlap。因为输入字符串的大小非常合适,所以我必须重新分配字符串,以便有足够的空间来连接两个字符串。我的功能如下:

char* merge_overlap (char** leftPiece, char** rightPiece, int num_overlap) {
      printf("in merge_overlap, left is %s, right is %s \n", *leftPiece, *rightPiece);

    *leftPiece = (char*) realloc(*leftPiece, (strlen(*leftPiece) + strlen(*rightPiece) - abs(num_overlap) + 1) * sizeof(char) );
    *leftPiece = strcat(*leftPiece, *rightPiece + abs(num_overlap));
    return *leftPiece;
}

在这个函数中,我首先重新分配左边的空间,然后连接两个字符串。但是当我编译时出现错误:

malloc: * 对象 0x100000f25 的错误:未分配重新分配的指针 * 在 malloc_error_break 中设置断点进行调试

谁能看出这是什么问题?

新增内容: 实际上,原始字符串数组在传递给此函数之前已重新排列。字符串数组包含许多字符串,我首先尝试找出两个重叠子字符串的字符串。然后我重新排列了两个字符串的索引,使左边的部分总是有一个较低的索引。代码如下: char *temp = frags[j]; 碎片[j] = 碎片[i]; 碎片[i] = 温度;这可能会导致错误发生。

问题已解决: 代码改编如下:

char *result = malloc(strlen(*leftPiece) + strlen(*rightPiece) -abs(num_overlap) + 1);
        strcpy(result, *leftPiece);
        strcat(result, *rightPiece + abs(num_overlap));
        return result;

【问题讨论】:

  • 当你为leftPiece分配内存时,错误可能会更早。
  • 你给merge_overlap()传递了什么?
  • 你怎么称呼merge_overlap,在调用它之前你malloc内存为leftPiece吗?
  • @EOF 我将 char * 传递给 merge_overlap。它只是一个字符指针,里面有一些字符串。
  • 问题不在显示的代码中。分配空间的代码最终通过*leftPiece 传递给此函数。你必须追踪它。考虑是否可以使用valgrind。如果它应该被重新分配,那么在调用函数之前确保*leftPiece是一个空指针。错误消息非常明确:它说正在重新分配的空间没有分配,而您刚刚确认它没有分配。你还有什么期待? C 不是一门可以握住你的手并确保你不犯错误的语言。

标签: c


【解决方案1】:

看起来问题在于merge_overlap() 要求您传入最初为malloc()ed 的leftPiece,但您传入了另一种类型的char *

你只能realloc一个最初用malloc分配的字符串。

要解决这个问题你需要malloc()原来的leftPiece

【讨论】:

  • 好的。非常感谢。我去看看
【解决方案2】:

正如 J. Leffler 和其他人指出的那样,您的错误出现在您之前的代码中,很可能 leftPiece 以前没有被声明为兼容指针,并且考虑到您的函数的工作,而不是以前分配给 @987654322 的函数@(或类似的)。为了realloc,指针不能被静态声明。否则,您的功能可以正常工作:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* merge_overlap (char** leftPiece, char** rightPiece, int num_overlap) 
{
    *leftPiece = realloc (*leftPiece, 
                        (strlen (*leftPiece) + 
                        strlen (*rightPiece) - 
                        abs(num_overlap) + 1));
    *leftPiece = strcat (*leftPiece, *rightPiece + abs(num_overlap));

    return *leftPiece;
}

int main (void) {

    char *str1 = strdup ("A quick brown fox jumps");
    char *str2 = strdup ("jumps over the lazy dog.");

    printf ("\n str1 : %s\n"
            " str2 : %s\n", str1, str2);

    merge_overlap (&str1, &str2, 5);

    printf ("\n merged:\n\n"
            " str1 : %s\n\n", str1);

    return 0;
}

输出

$ ./bin/mergoverlap

 str1 : A quick brown fox jumps
 str2 : jumps over the lazy dog.

 merged:

 str1 : A quick brown fox jumps over the lazy dog.

【讨论】:

  • 非常感谢。 (请查看我的原始帖子,我添加了以下评论)实际上原始字符串数组在传递给此函数之前已重新排列。字符串数组包含许多字符串,我首先尝试找出两个重叠子字符串的字符串。然后我重新排列了两个字符串的索引,使左边的部分总是有一个较低的索引。代码如下: char *temp = frags[j];碎片[j] = 碎片[i];碎片[i] = 温度;这可能会导致错误发生。
  • 关键是leftPiece 必须最初声明为char *leftPiece;,然后分配并填充一些有趣的东西,然后再调用merge_overlap。在上面的示例中,strdup() 都使用 malloc 分配并复制到 str1str2
猜你喜欢
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
相关资源
最近更新 更多