【发布时间】: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