我有以下代码行:
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);