指针参数上的Malloc失败

指针参数上的Malloc失败,c,pointers,struct,scope,malloc,C,Pointers,Struct,Scope,Malloc,我有以下几行代码: 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

我有以下几行代码:

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_initializer方法中的malloc在该方法返回时不与作为参数传递的指针保持连接?对初始化器的调用似乎没有任何作用。我意识到传递一个实际的c_obj_对象而不是作为指针将意味着在初始化器中所做的更改不会返回,但我认为动态内存会在整个程序中永久存在。

因为当调用函数时,它会发送指针的副本,当您在函数中更改它时,您不会在调用方法中更改它。您需要在初始化之前对其进行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

例如:

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;
}

如果出于某种原因需要在函数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;
}
然后像这样叫:

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

如果出于某种原因需要在函数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;
}
然后像这样叫:

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

啊,我明白了!Malloc仅将本地指针副本分配给指向新内存的指针。谢谢啊,我明白了!Malloc仅将本地指针副本分配给指向新内存的指针。谢谢虽然这在语法上是正确的,但我会避免这样做,仅因为能够在函数中malloc它而发送双指针是一种糟糕的编程实践。你有所有额外的取消引用,你必须将其释放出来,如果你正在初始化多个对象,这可能很难做到。@drew我同意你关于谁是对象所有者的问题的观点,但有时你需要这样做,因为继承的设计和坚持某种约定来决定谁是所有者。虽然这在语法上是正确的,但我会避免这样做,仅仅因为能够在函数中malloc它而发送双指针是一种糟糕的编程实践。你有所有额外的取消引用,你必须将其释放出来,如果你正在初始化多个对象,这可能很难做到。@drew我同意你关于谁是对象所有者的问题的观点,但有时,由于继承的设计,您需要这样做,并坚持某种约定来决定谁是所有者。