应该使用 realloc 吗?

发布于 2024-12-08 14:16:58 字数 515 浏览 1 评论 0原文

在查看了一些开源项目的 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 是性能杀手吗(如我的代码中/经常使用的那样)?

After looking at some open source projects C code I'm not sure if I'm doing stuff right.

When I'm creating strings (char *), I've normally done this:

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

When I'm changing my string (normally done within a function):

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

On lots of open source projects I see that many dev's just do:

char another_string[1024];

Questions:

  • Is my usage of realloc okay?
  • Is realloc a performance killer (as used in my code / very often)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

失去的东西太少 2024-12-15 14:16:58

哇哦...

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

在 C 语言中是一个严重的禁止。如果realloc失败,那么您就失去了freemystring的能力,因为您已经用NULL覆盖了它。

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

Whoa there ...

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

is a serious no-no in C. If realloc fails, then you have lost your ability to free mystring since you have overwritten it with NULL.

In terms of performance and reliability, I have always liked fixed length buffers on the stack. It really does depend on your requirements. If you have caps on your data sets, then using fixed length buffers is great. You just have to be very careful not to overrun buffers and what not. Then again, in C you always have to be concerned with NUL terminating buffers and making sure that you don't overrun them.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文