【发布时间】:2021-09-12 04:20:03
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
char* ch_reversed(const char* const str);
size_t ch_length(const char* const str);
int main()
{
char* str = "merhaba";
printf("%s", ch_reversed(str));
return 0;
}
char* ch_reversed(const char* const str)
{
if (!ch_length(str))
return NULL;
char* temp = malloc(ch_length(str) + 1);
size_t length = ch_length(str);
for (size_t i = 0; i < length; i++)
temp[i] = str[length - i - 1];
temp[length] = '\0';
return temp;
}
size_t ch_length(const char* const str)
{
size_t length = 0;
while (str[length++]) {}
return length - 1;
}
-
在该代码中,我为反转字符串分配了内存,在主函数中,我直接将
ch_reversed函数传递给printf。但这是否会导致内存泄漏,因为我无法使用这种类型的用法释放内存?如果是这样,我可以将返回值分配给变量并使用该变量并用它释放内存,但我不想这样做。我希望能够像在这里一样直接使用该功能。那我该怎么办? -
对于这种情况,将字符串作为
const char* const传递是否合适,因为我无论如何都不会更改参数?或者我应该以const char*或其他方式传递它? -
最后,有什么不好的地方要改吗?
【问题讨论】:
-
是的,你有一个泄漏——你必须从
ch_reversed()捕获返回值并在退出之前释放它以避免泄漏。另一种方法是接受泄漏,或者将预先分配的缓冲区(及其长度)传递给函数(以及要反转的字符串)。const char *或const char * const都可以;只使用const char *更为常见,因为指针本身是否改变并不重要——它只是来自main()程序(调用函数)的变量的副本。你写的没问题。 -
未正确处理空字符串。在这种情况下,它应该返回一个空字符串,即一个指向空字符的指针。相反,它返回一个
NULL指针。您应该能够打印空字符串,但尝试打印NULL指针会导致段错误。根本不需要对空字符串进行特殊处理。只需删除整个检查,(1)您将修复错误,并且(2)您的代码会更小。 -
另外,
const char* const str声明并没有真正的意义。他们应该是const char *str。关键是指针的目标是恒定的。没有人关心指针本身。例如,查看手册页中的strcpy之类的内容,看看它们是如何声明其字符串参数的。 -
顺便说一句,为给定的非空字符串调用
ch_length()三次似乎有点过分——一次就足够了。保存第一次(唯一)调用的长度并在后续行中使用它。鉴于您在其他地方大量使用const,令人惊讶的是您没有在char* str = "merhaba";中使用const。 -
顺便说一句,有什么理由使用您自己的 strlen() 实现?我使用了 C 实现,其中 strlen 进行了高度优化,运行速度比原始代码快很多倍,例如通过同时检查 8 或 16 个字节的 nul 字符。
标签: c string function pointers memory-leaks