gpt4 book ai didi

c - 替换功能中的内存管理

转载 作者:太空宇宙 更新时间:2023-11-04 07:55:31 24 4
gpt4 key购买 nike

我正在尝试用 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;
}

这是我目前看到的输出:

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可能会失败并返回NULL,让你失去原来的指针。

第二个问题是 new_text 最初并不指向一个以 null 结尾的字符串,这使得调用 strcat undefined behavior .

else分支也有问题:

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

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

关于c - 替换功能中的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50386791/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com