C 替换功能中的内存管理
我正在尝试用C语言制作一个替换函数。我知道有很多我可以复制的函数,但为了练习,我决定制作自己的函数 然而,我被困在这一点上:C 替换功能中的内存管理,c,string,replace,dynamic-memory-allocation,C,String,Replace,Dynamic Memory Allocation,我正在尝试用C语言制作一个替换函数。我知道有很多我可以复制的函数,但为了练习,我决定制作自己的函数 然而,我被困在这一点上: #include <stdio.h> #include <string.h> #include <stdlib.h> void replace_content(char *rep, char *with, char **text) { int len_rep = strlen(rep); int len_with = strl
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void replace_content(char *rep, char *with, char **text) {
int len_rep = strlen(rep);
int len_with = strlen(with);
char *p = *text;
int new_text_size = 0;
char *new_text = malloc(new_text_size);
do {
if (!strncmp(p, rep, len_rep)) {
new_text_size += len_with;
new_text = (char *) realloc(new_text, new_text_size + 1);
strcat(new_text, with);
p += len_rep;
} else {
new_text_size++;
new_text = (char *) realloc(new_text, new_text_size);
new_text[new_text_size-1] = *p;
p++;
}
} while (*p != '\0');
*text = malloc(new_text_size);
strcpy(*text, new_text);
}
int main() {
printf("Testing a replace function:\n");
char *text =
"<serviceName>\n"
" <label1>a</label1>\n"
" <label2>b</label2>\n"
" <label3>c</label3>\n"
"</serviceName>\n";
printf("Before replace:\n%s", text);
replace_content("serviceName>", "serviceNameResponse>", &text);
printf("After replace:\n%s", text);
return 0;
}
#包括
#包括
#包括
void replace_内容(char*rep,char*with,char**text){
int len_rep=strlen(rep);
int len_with=strlen(with);
char*p=*文本;
int new_text_size=0;
char*new_text=malloc(new_text_size);
做{
如果(!strncmp(p,rep,len_rep)){
新的文本大小+=带有的长度;
新文本=(char*)realloc(新文本,新文本大小+1);
strcat(新文本,带有);
p+=透镜代表;
}否则{
新文本大小++;
新文本=(char*)realloc(新文本,新文本大小);
新文本[新文本大小-1]=*p;
p++;
}
}而(*p!='\0');
*text=malloc(新文本大小);
strcpy(*文本,新文本);
}
int main(){
printf(“测试替换函数:\n”);
字符*文本=
“\n”
“a\n”
“b\n”
“c\n”
“\n”;
printf(“替换前:\n%s”,文本);
替换内容(“serviceName>”、“serviceNameResponse>”、&text);
printf(“替换后:\n%s”,文本);
返回0;
}
这是我目前看到的结果:
Testing a replace function:
Before replace:
<serviceName>
<label1>a</label1>
<label2>b</label2>
<label3>c</label3>
</serviceName>
After replace:
<0�serviceNameRespons
<label1>a</label1>
<label2>b</label2>
<label3>c</label3>
</serviceNameResponse>
测试替换功能:
更换前:
A.
B
C
更换后:
这两种说法有问题:
new_text = (char *) realloc(new_text, new_text_size + 1);
strcat(new_text, with);
第一个问题是,您永远不应该直接分配回重新分配的指针。这是因为realloc
可能会失败并返回NULL
,从而丢失原始指针
第二个问题是new\u text
最初并不指向以null结尾的字符串,这使得调用strcat
else
分支中还有一个问题:
new_text = (char *) realloc(new_text, new_text_size);
new_text[new_text_size-1] = *p;
除了重新分配回正在重新分配的指针时存在相同的问题外,在new\u text
中不终止字符串这两个语句都有问题:
new_text = (char *) realloc(new_text, new_text_size + 1);
strcat(new_text, with);
第一个问题是,您永远不应该直接分配回重新分配的指针。这是因为realloc
可能会失败并返回NULL
,从而丢失原始指针
第二个问题是new\u text
最初并不指向以null结尾的字符串,这使得调用strcat
else
分支中还有一个问题:
new_text = (char *) realloc(new_text, new_text_size);
new_text[new_text_size-1] = *p;
除了重新分配回被重新分配的指针的相同问题外,在new\u text
中没有终止字符串,原因可能是第10行char*new\u text=malloc(new\u text\u size)中的malloc(0)代码>
函数的作用是:分配大小字节并返回指向
分配的内存。内存未初始化。如果大小为0,
然后malloc()返回NULL或唯一的指针值
以后可以成功传递给free()
我建议使用char*new_text=NULL代码>。原因可能是第10行中的malloc(0)char*new\u text=malloc(new\u text\u size)代码>
函数的作用是:分配大小字节并返回指向
分配的内存。内存未初始化。如果大小为0,
然后malloc()返回NULL或唯一的指针值
以后可以成功传递给free()
我建议使用char*new_text=NULL代码>取而代之。对于初学者来说,内存泄漏,因为您没有释放分配给新文本的内存。另一方面,您不需要立即释放它,因为您可以简单地执行*text=*new\u text
new\u text=malloc(1);新文本[0]=0
似乎比您现在拥有的更好(诚然,无错误检查,但我希望您能抓住重点)。对于初学者来说,您有内存泄漏,因为您没有释放分配给新文本的内存。另一方面,您不需要立即释放它,因为您可以简单地执行*text=*new\u text
new\u text=malloc(1);新文本[0]=0
似乎比您现在拥有的更好的开场白(无可否认,它没有错误检查,但我希望您能理解这一点)。不幸的是,我发布了一个有点混乱的代码版本,但我所有问题的关键是else分支中字符的副本以及那里没有空终止符。第一个<被正确复制,但它不是以null结尾的,因此strcat开始连接到第一个可用的null字符串中。就是这样。不幸的是,我发布了一个有点混乱的代码版本,但我所有问题的关键是else分支中字符的副本以及那里没有空终止符。第一个<被正确复制,但它不是以null结尾的,因此strcat开始连接到第一个可用的null字符串中。