2

我正在阅读有关修剪的维基百科文章,并看到了 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 istead,会发生不好的事情吗?

char *
ltrim(char *str)
{
  char *ptr;
  int  len;

  for (ptr = str; *ptr && isspace((int)*ptr); ++ptr);

  return ptr;
}
4

2 回答 2

7

如果你返回ptr——即一个不同于原始指针的指针值——并且如果该指针是指向原始内存块的唯一指针,那么没有人能够访问free()它,并且会发生内存泄漏。您不能调用free()指向已分配块中间的指针,而只能调用指向块开头的指针——即,只能调用最初由malloc().

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

于 2012-07-09T19:19:25.413 回答
3

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

ltrim()预计会有副作用,将字符串更改到位

例如,

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

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

编辑添加:

下面的评论合理地问:“预期谁?

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

对于那些没有它的人(这里就是这种情况),我希望他们能原地改变字符串,有时会返回一个指向结果的指针,有时不会。

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

于 2012-07-09T19:56:42.660 回答