使用realloc连接字符串

使用realloc连接字符串,c,arrays,realloc,strcat,C,Arrays,Realloc,Strcat,我正在尝试合并两个字符串,假设“dest”字符串没有足够的空间添加另一个字符串,所以我使用动态数组来解决它 问题是试图编译代码时出现了mremap\u chunk错误 我不知道我错过了什么,因为realloc调用有所有正确的参数 错误: malloc.c:2869: mremap_chunk: Assertion `((size + offset) & (GLRO (dl_pagesize) - 1)) == 0' failed. Aborted (core dumped) #包

我正在尝试合并两个字符串,假设“dest”字符串没有足够的空间添加另一个字符串,所以我使用动态数组来解决它

问题是试图编译代码时出现了mremap\u chunk错误

我不知道我错过了什么,因为realloc调用有所有正确的参数


错误:

malloc.c:2869: mremap_chunk: Assertion `((size + offset) & (GLRO (dl_pagesize) - 1)) == 0' failed. 
Aborted (core dumped)

#包括
#包括
#包括
char*strcat(char*s1,char*s2)
{
int a=strlen(s1);
int b=strlen(s2);
int i,大小_ab=a+b;
s1=(char*)realloc(s1,size_ab*sizeof(char));

对于(i=0;i首先,您将非堆内存视为堆内存,不要这样做

第二,在计算中不包括终止符的空间

这里还有一些要点:

  • 不要命名以
    str
    开头的函数,这是一个保留的名称空间
  • 缓冲区大小应为
    size\u t
    ,而不是
    int
  • 当您知道内存块的大小时,使用
    memcpy()
    复制内存块
  • “右侧”字符串应为
    const
  • 处理分配错误的可能性
  • 我认为按<代码> siZeof(char)进行缩放是不好的做法,总是1。 假设逻辑相同,我会这样写:

    char*my_strcat(char*s1,const char*s2)
    {
    常数大小=strlen(s1);
    常数大小=strlen(s2);
    常数大小\u t大小\u ab=a+b+1;
    s1=realloc(s1,尺寸_ab);
    memcpy(s1+a、s2、b+1);
    返回s1;
    }
    
    首先,您将非堆内存视为堆内存,不要这样做

    第二,在计算中不包括终止符的空间

    这里还有一些要点:

  • 不要命名以
    str
    开头的函数,这是一个保留的名称空间
  • 缓冲区大小应为
    size\u t
    ,而不是
    int
  • 当您知道内存块的大小时,使用
    memcpy()
    复制内存块
  • “右侧”字符串应为
    const
  • 处理分配错误的可能性
  • 我认为按<代码> siZeof(char)进行缩放是不好的做法,总是1。 假设逻辑相同,我会这样写:

    char*my_strcat(char*s1,const char*s2)
    {
    常数大小=strlen(s1);
    常数大小=strlen(s2);
    常数大小\u t大小\u ab=a+b+1;
    s1=realloc(s1,尺寸_ab);
    memcpy(s1+a、s2、b+1);
    返回s1;
    }
    
    您不能
    realloc
    释放未分配调用
    malloc
    或非
    NULL
    的内存

    来自第7.22.3.5节。C11草案中的realloc功能

    realloc
    函数解除分配由
    ptr
    指向的旧对象,并 返回指向新对象的指针,该对象的大小由size指定。 新对象的内容应与旧对象的内容相同 对象在解除分配之前,以新的和旧的较小者为准 大小。新对象中超出旧对象大小的任何字节 具有不确定的值

    因此,
    s1=(char*)realloc(s1,size_ab*sizeof(char));
    对于您的输入(自动数组)来说显然是错误的,千万不要这样做


    还有更多的问题可以在调试器的帮助下解决。

    您不能
    realloc
    释放
    未通过调用
    malloc
    分配的内存,也不能
    NULL

    来自第7.22.3.5节。C11草案中的realloc功能

    realloc
    函数解除分配由
    ptr
    指向的旧对象,并 返回指向新对象的指针,该对象的大小由size指定。 新对象的内容应与旧对象的内容相同 对象在解除分配之前,以新的和旧的较小者为准 大小。新对象中超出旧对象大小的任何字节 具有不确定的值

    因此,
    s1=(char*)realloc(s1,size_ab*sizeof(char));
    对于您的输入(自动数组)来说显然是错误的,千万不要这样做

    还有更多的问题可以在调试器的帮助下解决。

    叮当声调试器给出了一个非常清晰的错误描述:

    malloc:  error for object 0x7fff6fbb16d6: pointer being realloc'd was not allocated
     set a breakpoint in malloc_error_break to debug
    
    两个数组都初始化为字符串文字。此外,函数尝试通过重新分配字符串文字来修改它,这是C标准,因为您无法重新分配未分配的内容,然后通过误用
    realloc()将第二个字符串文字的成员复制到要修改的“对象”中
    在字符串文本上

    如果您动态定义了第三个字符串,并在其中对这两个字符串的内容求和,则代码将起作用:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    char *mystrcatt(char *s1, char *s2)
    {
        int a = strlen(s1);
        int b = strlen(s2);
        int i, size_ab = a+b;
    
        char *s3 = malloc (size_ab*sizeof(char)); //sizeof(char) is always 1
    
        for(i=0; i<a; i++) { //inefficient
            (s3[i])=s1[i];
        }    
    
        for(i=0; i<b; i++) { //inefficient
            (s3[i+a])=s2[i];
        }
    
        s3[size_ab]='\0';
    
        return s3;
    }
    
    
    int main()
    {
        char s1[]="12345";
        char s2[]="qwerty";
        char *s3 = mystrcatt(s1,s2);    
        printf("%s\n", s3);
        free(s3);
        return 0;
    }
    
    #包括
    #包括
    #包括
    char*mystrcatt(char*s1,char*s2)
    {
    int a=strlen(s1);
    int b=strlen(s2);
    int i,大小_ab=a+b;
    char*s3=malloc(size_ab*sizeof(char));//sizeof(char)始终为1
    对于(i=0;在C中返回
    malloc()

    clang调试器给出了一个非常清晰的错误描述:

    malloc:  error for object 0x7fff6fbb16d6: pointer being realloc'd was not allocated
     set a breakpoint in malloc_error_break to debug
    
    两个数组都初始化为字符串文字。此外,函数尝试通过重新分配字符串文字来修改它,这是C标准,因为您无法重新分配未分配的内容,然后通过误用
    realloc()将第二个字符串文字的成员复制到要修改的“对象”中
    在字符串文本上

    如果您动态定义了第三个字符串,并在其中对这两个字符串的内容求和,则代码将起作用:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    char *mystrcatt(char *s1, char *s2)
    {
        int a = strlen(s1);
        int b = strlen(s2);
        int i, size_ab = a+b;
    
        char *s3 = malloc (size_ab*sizeof(char)); //sizeof(char) is always 1
    
        for(i=0; i<a; i++) { //inefficient
            (s3[i])=s1[i];
        }    
    
        for(i=0; i<b; i++) { //inefficient
            (s3[i+a])=s2[i];
        }
    
        s3[size_ab]='\0';
    
        return s3;
    }
    
    
    int main()
    {
        char s1[]="12345";
        char s2[]="qwerty";
        char *s3 = mystrcatt(s1,s2);    
        printf("%s\n", s3);
        free(s3);
        return 0;
    }
    
    #包括
    #包括
    #包括
    char*mystrcatt(char*s1,char*s2)
    {
    int a=strlen(s1);
    int b=strlen(s2);
    int i,大小_ab=a+b;
    char*s3=malloc(size_ab*sizeof(char));//sizeof(char)始终为1