结构体、类型定义和动态内存分配(malloc、calloc)

3

我想创建和使用类似以下的东西:

struct mystruct { 
    mystruct * AnOtherMyStruct; //mystruct must have a pointer to an other mystruct inside
    ...some stuffs...  
};

我应该使用 "typedef struct" 吗?有哪些优缺点?

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

我的结果会是这样的:

struct (or typedef struct) mystruct  {
    mystruct * AnOtherMyStruct;
    ...
};
int main () {

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

你认为,在考虑到这些操作会经常执行的情况下,哪种方式是分配和释放结构体的最佳选择?

1
“它完成相同的工作,但更好。” - 你有没有问过那个人为什么这样说?我只是问一下,因为他们似乎更容易证明他们的结论,而不是我们假设我们成功地进入了他们的头脑。每个函数都有其优点。其中一个(calloc)在语法上更适合序列分配,并具有零填充分配块的附加功能。无论这是否是您使用的有益功能,只有您自己可以决定。 - WhozCraig
4
请不要一次问两个完全无关的问题。请[编辑]您的问题,只关注一个问题。 - user694733
我想知道创建和定义结构体的最佳方式是什么,考虑到我会经常创建和释放这些结构体。这就是为什么我要问优缺点的原因... - feded
我应该使用 "typedef struct" 吗?对于 “你认为哪个是最好的选择” ,可以参考 https://dev59.com/1XI_5IYBdhLWcg3wEexu 。而“哪个是最好的选择”是基于个人意见的 - 最佳选择使用什么标准来进行比较?执行速度?编写速度?作者的理智程度? - KamilCuk
谢谢KamilCuk,我在你的链接中找到了好东西。 - feded
2个回答

3

calloc()malloc()几乎相同。

calloc()会用0初始化所请求的内存。

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


3
我应该使用"typedef struct"还是不用?优缺点是什么?
这只是主观的编程风格。最常见的做法是使用typedef。其中一个好处是它使代码的行为像C++一样。明确地打出 "struct name" 也可以,这是Linux喜欢的一种风格。两种风格都没有明显的对错之分。
然而,对于自引用结构体,在任何情况下,无论使用哪种风格,您都必须始终使用"struct"表示指针成员。
typedef struct foo
{
  struct foo* next;
} foo_t;

foo_t* next 不可行,因为在那时typedef还未完成定义。然而,foo 是一个结构体标签而不是类型名称,所以遵循不同的规则。如果你想在内部使用typedef名称,则必须提前声明该结构体:

typedef struct foo foo_t;  // forward declaration
struct foo
{
  foo_t* next;
};

当我分配内存时,有人告诉我使用calloc比malloc更好,因为它执行相同的任务但会更好... 当有人这样告诉你时,请问一下他们,calloc有什么优势。在编程时,批判性思维非常重要。
  • malloc 分配一块内存,但不将其初始化为已知值。由于没有初始化,malloccalloc 更快。
  • calloc 分配一块内存,或者可选地分配一个保存在相邻内存单元中的块数组。 它会初始化所有内存,意味着它具有已知的默认值。因此,它比 malloc 慢。
所以哪个更好,更快还是预初始化的? 这取决于你想做什么。

1
@feded 为什么你想要在类型和变量中使用完全相同的名称呢?这只会让人感到困惑 - 不要写出令人困惑的代码。 - Lundin
好的,我明白了:typedef struct node MyVar是类型节点名称为myvar,对吗? - feded

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接