0

我正在尝试制作一个在另一个字符串之后附加一个字符串的函数。我正在目睹以下错误。请帮忙。 * 检测到 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;
}
4

4 回答 4

2

问题是您首先尝试重新分配未分配的内存(以realloc想要的方式)。

您在函数中声明str1为数组main,此内存将由编译器在堆栈上分配,而不是在堆上。该realloc函数只能通过或之前的malloc调用重新分配在堆上分配的内存。callocrealloc

如果realloc调用会起作用,那么您就会发生内存泄漏,因为您分配内存并将其分配给newstr1并在下一行newstr1中用指针覆盖newstr指针。

而且您真的不应该分配固定大小,请记住将一个大小字符串附加m到一个大小字符串n。想想如果m + n大于 9 会发生什么。这会导致下一个问题,即您不会终止生成的字符串,因为您没有复制终止'\0'字符。

于 2013-07-10T11:33:56.330 回答
0

str1您正在使用的可能不是以 '\0' 结尾。您必须手动将该字符放在末尾。

您不能重新分配在堆栈上分配的内存。str1在栈上分配。

Properstrcat()有其他顺序的参数。目的地是第一位的。

你的命名约定很糟糕。str? newstr? source和怎么样destination。而且,m什么n也不说。为什么不sourceLendestinationLen

完成循环后,strcatstring()不要将 '\0' 字符放在末尾。使用该字符串很可能会出现内存错误。

于 2013-07-10T11:50:45.090 回答
0

您的 str1 是一个数组,它在堆栈上分配。realloc()必须用于在堆上分配空间的指针。

于 2013-07-10T12:07:59.953 回答
0

尝试在调用时将指针传递给指针,如下所示

strcatstring(str,&newstr);
于 2013-07-10T11:44:35.453 回答