在函数中初始化结构然后存储其地址
Initializing struct within a function then storing its address
嗨,我有这样的结构
struct small_struct {
int a;
int b;
}
struct big_struct {
struct *small_struct child;
}
我想将 big_struct
的指针作为参数传递给初始化 child
的函数。
static int my_function(struct big_struct* s) {
if (certain_condition)
s->child = &(struct small_struct) {
.a = 1;
.b = 2;
}
}
但是,当我这样做并且 my_function
完成时,s->child
中的字段经常在 my_function
之外更改。有没有办法保持 a
和 b
值在 my_function
中初始化?
谢谢!
问题在这里:
s->child = &(struct small_struct) {
.a = 1;
.b = 2;
}
这会在函数的 堆栈 内存中创建结构,然后将 s->child
指针分配给该内存。一旦函数 returns,该内存就不再分配给您的结构。您需要做的是使用 malloc
为结构分配 heap 内存,它将保持分配状态,直到调用 free
释放为止:
static int my_function(struct big_struct* s) {
if (certain_condition)
{
//Allocate *heap* memory for the pointer
//This must be freed later!
//e.g free(s.child);
s->child = malloc(sizeof(struct small_struct));
s->child->a = 1;
s->child->b = 2;
}
或者,根据您要执行的操作,不要将 child
设为指针,这样内存已经分配到 big_struct
的实例中,例如:
struct big_struct
{
struct small_struct child; //Note: not a pointer
};
static int my_function(struct big_struct* s) {
if (certain_condition)
{
//Memory for child member is already allocated
s->child.a = 1;
s->child.b = 2;
}
}
嗨,我有这样的结构
struct small_struct {
int a;
int b;
}
struct big_struct {
struct *small_struct child;
}
我想将 big_struct
的指针作为参数传递给初始化 child
的函数。
static int my_function(struct big_struct* s) {
if (certain_condition)
s->child = &(struct small_struct) {
.a = 1;
.b = 2;
}
}
但是,当我这样做并且 my_function
完成时,s->child
中的字段经常在 my_function
之外更改。有没有办法保持 a
和 b
值在 my_function
中初始化?
谢谢!
问题在这里:
s->child = &(struct small_struct) {
.a = 1;
.b = 2;
}
这会在函数的 堆栈 内存中创建结构,然后将 s->child
指针分配给该内存。一旦函数 returns,该内存就不再分配给您的结构。您需要做的是使用 malloc
为结构分配 heap 内存,它将保持分配状态,直到调用 free
释放为止:
static int my_function(struct big_struct* s) {
if (certain_condition)
{
//Allocate *heap* memory for the pointer
//This must be freed later!
//e.g free(s.child);
s->child = malloc(sizeof(struct small_struct));
s->child->a = 1;
s->child->b = 2;
}
或者,根据您要执行的操作,不要将 child
设为指针,这样内存已经分配到 big_struct
的实例中,例如:
struct big_struct
{
struct small_struct child; //Note: not a pointer
};
static int my_function(struct big_struct* s) {
if (certain_condition)
{
//Memory for child member is already allocated
s->child.a = 1;
s->child.b = 2;
}
}