gpt4 book ai didi

c - 使用基本修剪示例在 C 中释放内存

转载 作者:太空宇宙 更新时间:2023-11-04 04:10:48 26 4
gpt4 key购买 nike

我试图在 C 中实现一个 trim 函数,在这样做时我使用了两个子函数,ltrimrtrim。我想知道我是否通过多次调用 malloc 以某种方式“泄漏”了内存。如果是这样,我应该在哪里释放内存或改变malloc的调用方式?

微调:

char * rtrim(char * string) {

size_t slen = strlen(string);
char * modified_string = malloc(slen + 1);
strcpy(modified_string, string);

for (int i=slen-1; i>0 ;i--) {
if (string[i] == ' ' || string[i] == '\t')
modified_string[i] = '\0';
else
break;
}

return modified_string;
}

修剪:

char * ltrim(char * string) {

char c;
int start_index = -1;

char * modified_string = malloc(strlen(string) + 1);

for (int i=0; (c=string[i]) != '\0'; i++) {
if ((c == ' ' || c == '\t') && (start_index == -1)) {
;
} else {
if (start_index == -1) start_index = i;
modified_string[i - start_index] = c;
}
}
return modified_string;
}

修剪:

char * trim(char * string) {
char * string1 = ltrim(string);
char * string2 = rtrim(string1);
return string2;
}

主要内容:

int main(int argc, char *argv[]) {

char * new_str = " howlin ";
printf("Original: \"%s\" | RTrimmed: \"%s\"\n", new_str, rtrim(new_str));
printf("Original: \"%s\" | LTrimmed: \"%s\"\n", new_str, ltrim(new_str));
printf("Original: \"%s\" | Trimmed: \"%s\"\n", new_str, trim(new_str));

return 0;
}

最佳答案

从技术上讲,您的函数并没有泄漏内存,但它们确实使调用代码泄漏内存变得非常容易。恰当的例子:您的示例 main 函数泄漏了对 ltrim/rtrim 的三个调用返回的缓冲区,以及您的 trim 函数泄漏 string1

相反,请考虑如何简化这些。 ltrim 根本不需要分配内存。它可以简单地返回一个指向输入字符串中第一个非空格字符的指针。不过,rtrim 并不是那么容易。

完全避免内存问题的一种方法是让函数修改输入字符串。你的输出永远不会比输入长,所以你总是有足够的可用缓冲区。 rtrim 将简单地将字符串末尾的第一个空白字符替换为 '\0',而 ltrimmemmove() 使用指向第一个非空白字符的指针。就地修改字符串意味着调用者知道他们负责制作副本、分配缓冲区等,并且更难意外泄漏内存。

关于c - 使用基本修剪示例在 C 中释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57881068/

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