【问题标题】:Malloc on a Pointer Parameter Failing指针参数上的 Malloc 失败
【发布时间】:2012-05-09 08:03:02
【问题描述】:

我有以下几行代码:

struct c_obj_thing *object = NULL;
c_obj_initalizer(object);
// at this point, (object == NULL) is 'true'
printf("Value: %d\n", object->value); // this segfaults

这是 c_obj_initializer 的定义:

int c_obj_initalizer(struct c_obj_thing *objParam) {
  objParam = malloc(sizeof(struct c_obj_thing));
  objParam->pointerThing = NULL;
  objParam->value = 0;
  return 0;
}

为什么 c_obj_initalizer 方法中的 malloc 在方法返回时不与作为参数传递的指针保持连接?似乎对初始化程序的调用没有做任何事情。我意识到传递一个实际的 c_obj_thing 而不是作为指针传递意味着初始化器中所做的更改不会返回,但我认为动态内存会在整个程序中持续存在。

【问题讨论】:

    标签: c pointers struct scope malloc


    【解决方案1】:

    因为当您调用函数时,它会发送指针的副本,当您在函数中更改它时,您不会在调用方法中更改。您需要在初始化程序之前对其进行 malloc。

    例如:

    struct c_obj_thing *object = malloc(sizeof(struct c_obj_thing));
    c_obj_initalizer(object);
    printf("Value: %d\n", object->value); // this segfaults
    
    
    int c_obj_initalizer(struct c_obj_thing *objParam) {  
      objParam->pointerThing = NULL;
      objParam->value = 0;
      return 0;
    }
    

    【讨论】:

    • 啊,我明白了! malloc 只分配本地指针副本指向新内存。谢谢!
    【解决方案2】:

    如果出于某种原因需要在函数c_obj_initalizer 中进行分配,则必须将指针传递给指向该函数的指针:

    int c_obj_initalizer(struct c_obj_thing ** objParam) {
      *objParam = malloc(sizeof(struct c_obj_thing));
      *objParam->pointerThing = NULL;
      *objParam->value = 0;
      return 0;
    }
    

    然后像这样调用:

    struct c_obj_thing *object = NULL;
    c_obj_initalizer(&object);
    

    【讨论】:

    • 虽然这在语法上是正确的,但我会避免这样做,仅出于能够在函数中 malloc 的原因发送双指针是一种不好的编程习惯。你有所有额外的取消引用,你必须在路上释放它,如果你正在初始化多个对象,这可能很难遵循。
    • @drew 我同意你关于“谁是对象的所有者”这个问题的观点,但有时你需要这样做(因为继承的设计)并坚持某种约定决定谁是所有者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多