使用realloc连接字符串
我正在尝试合并两个字符串,假设“dest”字符串没有足够的空间添加另一个字符串,所以我使用动态数组来解决它 问题是试图编译代码时出现了mremap\u chunk错误 我不知道我错过了什么,因为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) #包
错误:
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