替换功能中的内存管理
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;
。
我正在尝试用 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;
。