Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 替换功能中的内存管理_C_String_Replace_Dynamic Memory Allocation - Fatal编程技术网

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

我正在尝试用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 = 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字符串中。