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_inititalizer の定義は次のとおりです。

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 を渡すと、イニタライザーで行われた変更が返されないことを意味することは理解していますが、プログラム全体で動的メモリが永続化されていると思いました。

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 に答える