1

我有以下代码行:

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_thing 不是作为指针将意味着在 initalizer 中所做的更改不会返回,但我认为动态内存会在整个程序中永久存在。

4

2 回答 2

4

因为当您调用函数时,它会发送指针的副本,当您在函数中更改它时,您不会在调用方法中更改。您需要在初始化程序之前对其进行 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;
}
于 2012-04-29T05:06:40.490 回答
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);
于 2012-04-29T05:11:28.377 回答