【发布时间】:2021-09-17 04:33:50
【问题描述】:
努力提高我的 C 技能。这个程序应该接受一个字符串并去掉它的空格。
我知道我已经给malloc 打了两次电话,但只打了一次free。我是否因此在某处获得了一些未释放的内存,或者因为我将原始指针分配给了新内存,它是否在我所做的一次 free 调用中消失了?
谢谢!
static void foo() {
char *string_to_change = malloc(sizeof(char) * 256);
strcpy(string_to_change, "my test");
printf("Before: %s\n", string_to_change); // "my test"
strip_whitespace(&string_to_change);
printf("After: %s\n", string_to_change); // "mytest"
free(string_to_change);
}
static void strip_whitespace(char **ptr) {
char *res = malloc(strlen(*ptr));
if (res == NULL)
exit_with_error(NULL_POINTER);
int current_pos = 0;
for (int i = 0; i < strlen(*ptr); i++) {
if (((*ptr)[i] == ' ') || ((*ptr)[i] == '\n' && ((*ptr)[i-1] == '\n' || (*ptr)[i+1] == '\0'))) {
continue;
}
res[current_pos] = (*ptr)[i];
current_pos++;
}
res[current_pos] = '\0';
*ptr = res;
}
【问题讨论】:
-
是的,存在泄漏,因为您没有
freefoo中分配的原始内存。 -
是的,原来的
string_to_change丢失了。在最坏的情况下,您的res是 1 个元素太短(没有空格)。 -
malloc(和类似函数)返回的每个指针都需要在某个时候通过调用free来释放,否则会造成内存泄漏。这些函数没有任何魔法。 -
@Barmar 字符串在 C 中以 null 结尾。这是我们在本网站上获得的最常见的 C 常见问题解答之一。
-
@HenryCooper
free(*ptr);*ptr = res;之前
标签: c pointers memory-management free