【问题标题】:Memory Allocation in Dynamic Linked List of Structs结构动态链表中的内存分配
【发布时间】:2019-10-14 08:26:40
【问题描述】:

本例中使用 Malloc 或 Calloc 分配内存有什么区别?
使用 Calloc 会破坏内存,但使用 Malloc 就可以了!
我的示例类似于(但具有许多值):

如果代码错误,我该怎么办?

typedef struct {
    int ID, age;
} person;

typedef struct {
    person *person;
    struct NO *next;
} NO;

...   // with calloc, the memory breaks
      // with  (NO*)malloc(sizeof(NO))  it´s fine

NO *p1, *px1, *px2;

px2 = (NO*)calloc(1, sizeof(NO));
p1 = px2;
px2->person->ID = 1; px2->person->age = 30;
px2->next = NULL;
px1 = px2;

px2 = (NO*)calloc(1, sizeof(NO));
px2->person->ID = 2; px2->person->age = 20;
px2->next = NULL;
px1->next = px2;

...

【问题讨论】:

  • 您从未分配过 px2.person。您正在推迟一个未初始化的指针。 calloc 失败,因为内存归零并且访问 0 会导致段错误。使用 malloc 它是 UB,但您可能正在写入随机内存位置。
  • calloc 通过将 person 设置为 NULL 来帮助您。

标签: c list memory dynamic


【解决方案1】:

本例中使用 Malloc 或 Calloc 分配内存有什么区别?

假设ab都是正数且a * b不溢出,calloc(a, b)malloc(a * b)的区别只是calloc将分配的内存初始化为全零。没有别的了。

使用 Calloc 会破坏内存,但使用 Malloc 很好!

无论您使用calloc() 还是malloc(),您的程序都是错误的,无论它是否吵闹。您为NO 分配内存,但随后您取消引用它的person 指针,而无需先将其分配为指向有效对象。无论您使用哪种分配函数,结果都是未定义的。

【讨论】:

  • 显然你是对的,引用一个空指针(或者在这种情况下,一个指向地址 0 的指针更好)被明确列为 UB,但在 dos 程序中访问中断并没有看到它桌子。好吧,也许旧时代的编译器根本不关心这样的优化......
  • @AdrianoRepetti,谁说表示全位为零的指针是空指针或指向地址 0 的指针?这两种情况中的任何一种可能都是这样,但 C 语言不承诺任何一种。
  • 对于 NULL 是真的,但分配 0 官方 认为与 C99 相同吗?我从来没有仔细阅读过标准关于这个的说法,那么它可能只有一个明确的分配。不确定。
  • @AdrianoRepetti 整数常量0 是一个空指针常量,将其分配给指针对象会使该对象的值成为空指针。但是这同样不适用于将值为 0 的整数 expression 分配给指针,并且这些都与指针对象表示中的位无关。已经有符合 C99 的实现,其中空指针的表示不是全位为零。
  • 你是对的,即使 0 用全零位表示也是如此。考虑表达式会使编译器变得非常困难。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 2014-11-24
相关资源
最近更新 更多