gpt4 book ai didi

c - 如何释放从另一个函数返回的 char*?

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

假设我们有以下场景。

char* halfString(char* input) {
char* output = malloc(strlen(input));
int i = 0;
for(i = 0; i < strlen(input); i++)
output[i] == input[i];
output[i] = '\0';
return output;
}

int main() {
char* input = "Hello";
char* output = halfString(input);
printf("%s\n",output);
free(output);
}

调用“free(output)”会释放 main 本地的 char* 输出内存,并释放 halfString() 本地的 char* 输出内存吗?或者 halfString() 的本地 char* 输出是否仍然存在内存泄漏?

感谢任何帮助。

最佳答案

没有内存泄漏。

不过,您似乎对堆分配的工作原理感到困惑。这里只有 一个 内存块被分配,它不是halfString()main() 的“本地”内存块。分配的 block 存在于堆中,并且不限于特定代码块。

malloc() 返回指向它的指针。然后将该指针返回给 main(),但指针的值仍然相同:它指向内存中的相同地址,相同的堆 block 。 main() 然后正确释放它。

作为设计考虑,这通常不是最好的做法。通常,调用者不一定知道 halfString() 返回的指针指向一个用 malloc() 分配的 block ,并且他们需要 免费()它。这必须非常清楚和仔细地记录下来。更好的解决方案可能是提供一个执行释放的 freeHalfString() 函数;那么从维护的角度来看,这两个函数可以放在同一个地方并同时维护,这样调用者就不需要担心缓冲区是如何分配的,或者如何释放它。

(正如其他人所指出的,您还存在缓冲区溢出,因为您需要分配 strlen(input) + 1 字节以包含 NULL 终止符。)

关于c - 如何释放从另一个函数返回的 char*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22722259/

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