将内存分配给结构和指向结构的指针
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
可能会破坏您分配的其他一些对象。
总而言之,第二次分配是错误的,即使它看起来有效。
这是我的结构定义
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
可能会破坏您分配的其他一些对象。
总而言之,第二次分配是错误的,即使它看起来有效。