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;
因为当您使用点运算符访问它时,这通常意味着它是静态的,而不是动态的。 ->
运算符通常意味着它是动态分配的。我想知道幕后是否发生了一些奇怪的事情(也许)。
“堆”是对内存管理例程(malloc
、free
和family
)管理的内存的俗称。曾经,该内存可能是用堆结构管理的,但现代例程更加复杂。这种内存的恰当术语是“动态分配的内存”。
通常,无论例程是使用堆还是其他数据结构来管理内存,它们都有一个可用内存数据库可供分配。例如,它们可能有一个块列表(无论是在堆、树、散列 table、位图、其他结构或结构的某种组合中)曾经分配的块已被释放,这样他们就可以再次分发了。或者该列表可能包括可用的内存,因为从操作系统获得了大量内存以满足较早的请求,但特定请求只需要其中的一部分,因此其余部分可用于将来的请求。
这对你的问题意味着什么,是堆中的成员 x
(及其所在的结构),当分配内存时,它实际上是 removed 来自堆或其他数据库。它不再可用,所以它不在可用内存的数据库中。
这意味着您分配的内存不在堆中。
此时,您的程序有责任跟踪该内存并在适当的时间使用 free
释放它。那将return它添加到数据库的可用内存中。 (合适的时间可能永远不会,如果您的程序完成其工作并正在退出。在通用多用户操作系统中,退出时不需要释放分配的内存;操作系统将回收它。)
但是,您分配的内存是动态分配的内存,从某种意义上说,它可能被视为此类内存池的“一部分”。也就是说,即使它当前不是可用内存数据库的一部分,它也是动态分配和释放的所有内存的一部分。
更具体地说,您的结构 struct _three
被定义为包含类型 struct _two
的成员 two
,并且包含类型 struct _one
的成员 one
],其中包括 int
类型的成员 x
。所有这些构成一个 struct _three
对象。 C 不会将它们视为可以在内存中拆分并单独管理的独立事物。只有当你有指针时,结构才能有一个成员连接到内存中的一个单独的东西。在这种情况下,您的程序将单独分配该内存;它将不得不使用 malloc
或相关的例程来为那个单独的东西获取内存,并将指针成员设置为指向另一个内存。
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;
因为当您使用点运算符访问它时,这通常意味着它是静态的,而不是动态的。 ->
运算符通常意味着它是动态分配的。我想知道幕后是否发生了一些奇怪的事情(也许)。
“堆”是对内存管理例程(malloc
、free
和family
)管理的内存的俗称。曾经,该内存可能是用堆结构管理的,但现代例程更加复杂。这种内存的恰当术语是“动态分配的内存”。
通常,无论例程是使用堆还是其他数据结构来管理内存,它们都有一个可用内存数据库可供分配。例如,它们可能有一个块列表(无论是在堆、树、散列 table、位图、其他结构或结构的某种组合中)曾经分配的块已被释放,这样他们就可以再次分发了。或者该列表可能包括可用的内存,因为从操作系统获得了大量内存以满足较早的请求,但特定请求只需要其中的一部分,因此其余部分可用于将来的请求。
这对你的问题意味着什么,是堆中的成员 x
(及其所在的结构),当分配内存时,它实际上是 removed 来自堆或其他数据库。它不再可用,所以它不在可用内存的数据库中。
这意味着您分配的内存不在堆中。
此时,您的程序有责任跟踪该内存并在适当的时间使用 free
释放它。那将return它添加到数据库的可用内存中。 (合适的时间可能永远不会,如果您的程序完成其工作并正在退出。在通用多用户操作系统中,退出时不需要释放分配的内存;操作系统将回收它。)
但是,您分配的内存是动态分配的内存,从某种意义上说,它可能被视为此类内存池的“一部分”。也就是说,即使它当前不是可用内存数据库的一部分,它也是动态分配和释放的所有内存的一部分。
更具体地说,您的结构 struct _three
被定义为包含类型 struct _two
的成员 two
,并且包含类型 struct _one
的成员 one
],其中包括 int
类型的成员 x
。所有这些构成一个 struct _three
对象。 C 不会将它们视为可以在内存中拆分并单独管理的独立事物。只有当你有指针时,结构才能有一个成员连接到内存中的一个单独的东西。在这种情况下,您的程序将单独分配该内存;它将不得不使用 malloc
或相关的例程来为那个单独的东西获取内存,并将指针成员设置为指向另一个内存。