Mallocing嵌套结构

Mallocing nested structs

if if 编写如下代码:

struct _one
{
    int x;
};
struct _two
{
    struct _one one;
};
struct _three
{
   struct _two two;
};

然后在 main 中我调用了一个用户定义的函数,它 malloces _three 结构,returns 指向 main 的指针是 x堆中的变量? 因为您以这种方式访问​​它:

three->two.one.x;

因为当您使用点运算符访问它时,这通常意味着它是静态的,而不是动态的。 -> 运算符通常意味着它是动态分配的。我想知道幕后是否发生了一些奇怪的事情(也许)。

“堆”是对内存管理例程(mallocfreefamily)管理的内存的俗称。曾经,该内存可能是用堆结构管理的,但现代例程更加复杂。这种内存的恰当术语是“动态分配的内存”。

通常,无论例程是使用堆还是其他数据结构来管理内存,它们都有一个可用内存数据库可供分配。例如,它们可能有一个块列表(无论是在堆、树、散列 table、位图、其他结构或结构的某种组合中)曾经分配的块已被释放,这样他们就可以再次分发了。或者该列表可能包括可用的内存,因为从操作系统获得了大量内存以满足较早的请求,但特定请求只需要其中的一部分,因此其余部分可用于将来的请求。

这对你的问题意味着什么,是堆中的成员 x(及其所在的结构),当分配内存时,它实际上是 removed 来自堆或其他数据库。它不再可用,所以它不在可用内存的数据库中。

这意味着您分配的内存不在堆中。

此时,您的程序有责任跟踪该内存并在适当的时间使用 free 释放它。那将return它添加到数据库的可用内存中。 (合适的时间可能永远不会,如果您的程序完成其工作并正在退出。在通用多用户操作系统中,退出时不需要释放分配的内存;操作系统将回收它。)

但是,您分配的内存是动态分配的内存,从某种意义上说,它可能被视为此类内存池的“一部分”。也就是说,即使它当前不是可用内存数据库的一部分,它也是动态分配和释放的所有内存的一部分。

更具体地说,您的结构 struct _three 被定义为包含类型 struct _two 的成员 two,并且包含类型 struct _one 的成员 one ],其中包括 int 类型的成员 x。所有这些构成一个 struct _three 对象。 C 不会将它们视为可以在内存中拆分并单独管理的独立事物。只有当你有指针时,结构才能有一个成员连接到内存中的一个单独的东西。在这种情况下,您的程序将单独分配该内存;它将不得不使用 malloc 或相关的例程来为那个单独的东西获取内存,并将指针成员设置为指向另一个内存。