替换功能中的内存管理

Memory management in replace function

我正在尝试用 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 != '[=10=]');
  *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;
}

这是我目前看到的输出:

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>

我的猜测是我在动态内存方面做错了什么,但我越看代码就越困惑。

这两个说法是有问题的:

new_text = (char *) realloc(new_text, new_text_size + 1);
strcat(new_text, with);

第一个问题是你永远不应该直接分配回你重新分配的指针。那是因为realloc可能会失败returnNULL,让你失去原来的指针。

第二个问题是 new_text 最初没有指向空终止字符串,这使得调用 strcat undefined behavior.

else分支也有问题:

new_text = (char *) realloc(new_text, new_text_size);
new_text[new_text_size-1] = *p;

除了重新分配回正在重新分配的指针的相同问题外,您没有终止 new_text 中的字符串。

可能原因是第 10 行的 malloc(0) char *new_text = malloc(new_text_size);

The malloc() function allocates size bytes and returns a pointer to the allocated memory. The memory is not initialized. If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free().

我建议改用 char *new_text = NULL;