将内存分配给结构和指向结构的指针

Allocating memory to a structure and pointer to a structure

这是我的结构定义

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

我试过使用这个分配内存

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

还有这个

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

第一个分配的内存等于 "node" 的大小,第二个分配的内存等于指针的大小。 但它们对我来说都非常好。 我的意思是我可以访问

head1-> value

head2->value

它们是一样的吗?

不,它们不一样。

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

事实上,您可以 "use" head2->value 而无需分配任何内存(并且无需为 head2 分配任何值)。你不会得到编译时错误,你甚至可能不会在运行时注意到它,但如果你有一个足够大的应用程序,你最终会看到奇怪的事情开始发生。

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

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

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