连接字符串时出错

时间:2013-07-10 11:30:48

标签: c pointers realloc

我正在尝试创建一个在另一个字符串之后应用字符串的函数。我正在目睹以下错误。请帮忙。 检测到 * 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 个答案:

答案 0 :(得分:2)

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

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

如果realloc调用有效,那么你有内存泄漏,因为你分配内存并将其分配给newstr1,并在下一行覆盖newstr1指针newstr指针。

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

答案 1 :(得分:0)

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

strcatstring(str,&newstr);

答案 2 :(得分:0)

您使用的

str1可能不会以'\ 0'结尾。你必须手动将该字符放在最后。

您无法重新分配堆栈上分配的内存。 str1在堆栈上分配。

正确的strcat()具有其他顺序的参数。目的地是第一位的。

您的命名惯例太糟糕了。 strnewstrsourcedestination怎么样?此外,mn什么也没说。为什么不sourceLendestinationLen

strcatstring()完成循环后,您不会在结尾处放置'\ 0'字符。您最有可能通过使用该字符串来获取内存错误。

答案 3 :(得分:0)

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