【问题标题】:Allocating memory to a structure and pointer to a structure将内存分配给结构和指向结构的指针
【发布时间】:2015-11-15 06:26:40
【问题描述】:

这是我的结构定义

struct node
{
  int value;
  struct node *next;
}

我尝试使用这个分配内存

struct node *head1=(node *)(malloc(sizeof(struct node)));

还有这个

struct node *head2=(node *)(malloc(sizeof(struct node *)));

第一个分配的内存等于“节点”的大小,第二个分配的内存等于指针的大小。 但他们两个对我来说都很好。 我的意思是我可以访问

head1-> value

head2->value

它们都一样吗?

【问题讨论】:

  • 你能分配和访问head2->next吗?
  • 为什么不在c++中使用new关键字?!

标签: c++ pointers malloc structure


【解决方案1】:

不,它们不一样。

第一个分配了足够的内存来容纳一个完整的结构,第二个只有足够的内存来存放一个指针。通过执行head2->value,您正在访问未分配的内存并将导致未定义的行为。

事实上,您可以“使用”head2->value,而无需分配任何内存(也无需为head2 分配任何值)。您不会收到编译时错误,甚至可能在运行时都没有注意到,但如果您有足够大的应用程序,您最终会看到奇怪的事情开始发生。

【讨论】:

    【解决方案2】:

    不,只有第一个是正确的。

    在第二种情况下,您分配的内存少于数据结构占用的内存。当您访问value 时,您完全没问题,因为value 在您的struct 的开头,并且在您分配的内容中。另一方面,访问next 将使用超出您分配的内存。具有欺骗性的是,由于内存分配的工作方式,它也很有可能起作用。在大多数情况下,分配给您的内存将位于分配给您的进程的页面中间的某个位置,并且属于您的进程的页面内的访问不会导致崩溃,因此如果您尝试读取或写入next ,在大多数情况下,它似乎可以工作(但在极少数情况下,您的分配可能恰好位于页面末尾,并且在这种情况下访问next 将崩溃)。但是,这不会是分配给您的对象的内存,并且可能很容易成为其他东西使用的内存。因此,写信给next 可能最终会损坏您分配的其他一些对象。

    总而言之,第二次分配是错误的,即使它看起来有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 2014-02-23
      • 2020-03-09
      • 1970-01-01
      • 2021-12-26
      • 2013-01-21
      • 1970-01-01
      相关资源
      最近更新 更多