我正在尝试创建一个在另一个字符串之后应用字符串的函数。我正在目睹以下错误。请帮忙。 检测到 * glibc ./a.out:realloc():旧版本无效:0x00007fff7af0d450 * *
// The following code concatenates the orignal string into the another
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void strcatstring(char *str,char *newstr)
{
int m=strlen(str);
int n=strlen(newstr);
newstr=(char *)realloc(newstr,10*sizeof(char));
char *newstr1=(char *)malloc(10*sizeof(char));
newstr1=newstr;
while(*newstr!='\0')
{
++newstr;
}
while(*str!='\0')
{
*newstr=*str;
++newstr;
++str;
}
printf("%s",newstr1);
}
int main()
{
int n=6;char *str;char str1[10];
str1[0]='y';
str1[1]='u';
str=(char *)malloc(n*sizeof(char));
printf("\nEnter the string\n");
scanf("%s",str);
puts(str);
strcatstring(str,str1);
return 0;
}
答案 0 :(得分:2)
问题在于您首先尝试重新分配未分配的内存(以realloc
想要的方式)。
您将str1
声明为main
函数中的数组,此内存将由编译器分配到堆栈而不是堆上。 realloc
函数只能通过malloc
,calloc
或之前的realloc
调用重新分配堆上分配的内存。
如果realloc
调用有效,那么你有内存泄漏,因为你分配内存并将其分配给newstr1
,并在下一行覆盖newstr1
指针newstr
指针。
你真的不应该分配一个固定的大小,记住你将一个大小为m
的字符串追加到一个大小为n
的字符串。想想如果m + n
大于9会发生什么。这会导致下一个问题,即您不会终止生成的字符串,因为您不复制终止'\0'
字符。
答案 1 :(得分:0)
尝试在调用时将指针传递给指针,如下所示
strcatstring(str,&newstr);
答案 2 :(得分:0)
str1
可能不会以'\ 0'结尾。你必须手动将该字符放在最后。
您无法重新分配堆栈上分配的内存。 str1
在堆栈上分配。
正确的strcat()
具有其他顺序的参数。目的地是第一位的。
您的命名惯例太糟糕了。 str
? newstr
? source
和destination
怎么样?此外,m
和n
什么也没说。为什么不sourceLen
和destinationLen
?
在strcatstring()
完成循环后,您不会在结尾处放置'\ 0'字符。您最有可能通过使用该字符串来获取内存错误。
答案 3 :(得分:0)
你的str1是一个数组,在堆栈上分配。 realloc()
必须用于在堆上分配空间的指针。