【问题标题】:Should it use realloc?它应该使用realloc吗?
【发布时间】:2011-12-03 16:53:30
【问题描述】:

在查看了一些开源项目的 C 代码后,我不确定自己是否做对了。

当我创建字符串 (char *) 时,我通常会这样做:

#define DEF_LEN 10
char *mystring;
mystring = malloc(DEF_LEN*sizeof(char));

当我更改字符串时(通常在函数内完成):

mystring = realloc(mystring, strlen(newstring)*sizeof(char)+1);
strcpy(mystring,newstring);

在许多开源项目中,我看到许多开发人员只是这样做:

char another_string[1024];

问题:

  • 我可以使用realloc 吗?
  • realloc 是性能杀手吗(在我的代码中/经常使用)?

【问题讨论】:

  • strlen(newstring)*sizeof(char)+1 应该是(strlen(newstring)+1)*sizeof(char)
  • @DavidHeffernan,也许更好,只是省略 sizeof(char) ?在任何情况下,与1 相乘并不重要,不是吗?
  • @Jens 这需要假设sizeof(char)==1 并不总是成立。也就是说,我不确定它不支持哪些平台。
  • @DavidHeffernan,sizeof 运算符定义为以 char 大小的倍数形式给出数据类型的大小。
  • @David Heffernan:Qouth ISO/IEC 9899 标准(简称 C99),第 6.5.3.4.2 点:当应用于具有 char、unsigned char 或 signed char 类型的操作数时,(或其合格版本)结果为 1.

标签: c malloc realloc


【解决方案1】:

哇哦...

mystring = realloc(mystring, strlen(newstring) * sizeof(char) + 1);

是认真的no-no in C。如果realloc 失败,那么你就失去了free mystring 的能力,因为你已经用NULL 覆盖了它。

在性能和可靠性方面,我一直喜欢堆栈上的固定长度缓冲区。这确实取决于您的要求。如果您的数据集有上限,那么使用固定长度的缓冲区非常好。你只需要非常小心不要超出缓冲区等等。话又说回来,在 C 语言中,您必须始终关注 NUL 终止缓冲区并确保不会超出它们。

【讨论】:

  • 内存分配器通常用于函数完成后必须保留的字符串。您为使用realloc()(以及后来的free())支付了(少量)时间成本。如果函数完成后不需要该字符串并且您可以为其确定合理的大小,那么使用局部变量会更快,并且在函数完成时会自动释放空间 - 而您必须释放 (free())自己显式分配内存 - 否则,您将遇到可怕的“内存泄漏”实例。因此,尽可能使用本地字符串;需要时使用分配的字符串。
猜你喜欢
  • 2012-12-10
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
  • 2012-10-15
相关资源
最近更新 更多