是否需要在C中修剪功能?

时间:2012-07-09 19:18:03

标签: c trim memmove

我正在阅读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;
}

2 个答案:

答案 0 :(得分:7)

如果返回ptr - 即指针值而不是原始指针 - 如果该指针是唯一指向原始内存块的指针,那么没有人能够{{1}它会,并且会有内存泄漏。您不能在指向已分配块中间的指针上调用free(),而只能在指向块开头的指针上调用{ - 1},即仅在free()最初返回的指针上调用。 / p>

如果由于某种原因你可以确定将保留指向原始块的指针,或者永远不需要释放块,则不需要malloc();但这些都是对通用实用程序例程的错误假设。

答案 1 :(得分:3)

最大问题:这不是预期ltrim()可行的方式。

ltrim()预计会产生副作用,即更改字符串

例如,

char *a = " hello";
trim(a);
printf(a);

预计会打印"hello",但如果没有memmove()则不会。

已编辑添加:

下面的评论合理地问道,“预计谁?

在具有自动垃圾收集的语言中,我希望字符串函数返回带有所需转换的 new 字符串。

对于没有它的人(这里就是这种情况),我希望他们能够改变字符串到位,有时会返回指向结果的指针,有时候不会。

所以也许我应该说:这不是预期C函数的工作方式。