C语言 指针参数上的 Malloc 失败



我有以下代码行:

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

以下是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;
}

为什么 c_obj_initalizer 方法中的 malloc 在方法返回时不附加到作为参数传递的指针? 似乎对启动器的调用没有任何作用。 我意识到传递实际c_obj_thing而不是指针意味着在启动器中所做的更改不会返回,但我认为动态内存在整个程序中永久存在。

因为当你调用一个函数时,它会发送指针的副本,当你在函数中更改它时,你不会在调用方法中改变。您需要在初始值设定项之前将其 malloc。

例如:

struct c_obj_thing *object = malloc(sizeof(struct c_obj_thing));
c_obj_initalizer(object);
printf("Value: %dn", object->value); // this segfaults

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

如果出于某种原因需要在函数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);

相关内容

  • 没有找到相关文章

最新更新