在函数中初始化结构然后存储其地址

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 之外更改。有没有办法保持 ab 值在 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;
  }
}