首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >结构,类型定义和malloc,calloc

结构,类型定义和malloc,calloc
EN

Stack Overflow用户
提问于 2019-11-27 19:12:47
回答 2查看 437关注 0票数 4

我想创建和使用如下内容:

代码语言:javascript
运行
复制
struct mystruct { 
    mystruct * AnOtherMyStruct; //mystruct must have a pointer to an other mystruct inside
    ...some stuffs...  
};

我是否应该使用"typedef struct“?哪些是有利的和不利的?

当我分配内存时,有人告诉我calloc比malloc更好,因为它做同样的工作,但更好……

我的结果将类似于:

代码语言:javascript
运行
复制
struct (or typedef struct) mystruct  {
    mystruct * AnOtherMyStruct;
    ...
};
int main () {

malloc or calloc =...
free(...);

考虑到这些操作将被频繁地执行,您认为分配和释放结构的最佳选择是什么?

EN

回答 2

Stack Overflow用户

发布于 2019-11-27 19:37:13

calloc()malloc()几乎是一样的。

calloc()使用0%s初始化声明的内存。

当您调用malloc()并尝试访问已分配类型的成员时,您将看到垃圾值(例如,对于int,您将看到类似于347289472的值),而对于calloc(),您将看到0作为初始值

票数 3
EN

Stack Overflow用户

发布于 2019-11-27 19:50:53

我是否应该使用"typedef“?哪些是有利的和不利的?

这只是一种主观的编码风格。最常见的样式是使用typedef。一个优点是它使代码的行为就像C++一样。显式地输入struct name也是可以的,这是Linux喜欢的一种风格。这两种风格显然都不是对的或错的。

但是,对于自引用结构,不管是什么样式,都必须始终使用struct表示法来编写指针成员。

代码语言:javascript
运行
复制
typedef struct foo
{
  struct foo* next;
} foo_t;

foo_t* next将不会工作,因为在这一点上类型定义并不完整。然而,foo是一个“结构标签”,而不是一个类型名称,所以它遵循不同的规则。如果您希望在内部使用typedef名称,则必须向前声明该结构:

代码语言:javascript
运行
复制
typedef struct foo foo_t;  // forward declaration
struct foo
{
  foo_t* next;
};

当我分配内存时,有人告诉我

比malloc更好,因为它做同样的工作,但更好……

当有人告诉你这一点时,问问他们calloc到底是如何更好的。在编程时,批判性思维非常重要。

  • malloc会分配一块内存,但不会将其初始化为已知值。由于没有初始化,因此malloccalloc.
  • calloc分配一个内存块,或者可选地分配一个放在相邻内存单元中的块数组更快。它对所有内存进行零初始化,这意味着它具有已知默认值。正因为如此,它比malloc.

那么,哪个“更好”,更快还是预初始化?这取决于你想做什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59068904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档