我正在阅读wikipedia article on Trimming并看到了ltrim(左侧修剪)的实现
char *
ltrim(char *str)
{
char *ptr;
int len;
for (ptr = str; *ptr && isspace((int)*ptr); ++ptr);
len = strlen(ptr);
memmove(str, ptr, len + 1);
return str;
}
如果我跳过memmove并返回ptr isntead会不会发生坏事?
char *
ltrim(char *str)
{
char *ptr;
int len;
for (ptr = str; *ptr && isspace((int)*ptr); ++ptr);
return ptr;
}
答案 0 :(得分:7)
如果返回ptr
- 即指针值而不是原始指针 - 如果该指针是唯一指向原始内存块的指针,那么没有人能够{{1}它会,并且会有内存泄漏。您不能在指向已分配块中间的指针上调用free()
,而只能在指向块开头的指针上调用{ - 1},即仅在free()
最初返回的指针上调用。 / p>
如果由于某种原因你可以确定将保留指向原始块的指针,或者永远不需要释放块,则不需要malloc()
;但这些都是对通用实用程序例程的错误假设。
答案 1 :(得分:3)
最大问题:这不是预期ltrim()
可行的方式。
ltrim()
预计会产生副作用,即更改字符串 。
例如,
char *a = " hello";
trim(a);
printf(a);
预计会打印"hello"
,但如果没有memmove()
则不会。
已编辑添加:
下面的评论合理地问道,“预计谁?”
在具有自动垃圾收集的语言中,我希望字符串函数返回带有所需转换的 new 字符串。
对于没有它的人(这里就是这种情况),我希望他们能够改变字符串到位,有时会返回指向结果的指针,有时候不会。
所以也许我应该说:这不是预期C函数的工作方式。