web-dev-qa-db-ja.com

Cの関数に構造体ポインターを渡す

構造体へのポインタを関数に渡すときに問題が発生します。私のコードは基本的に以下に示すものです。メイン関数でmodify_itemを呼び出した後、stuff == NULL。 5に等しい要素を持つ項目構造体へのポインターにしたいのですが、何が間違っていますか?

void modify_item(struct item *s){
   struct item *retVal = malloc(sizeof(struct item));
   retVal->element = 5;
   s = retVal;
}

int main(){
   struct item *stuff = NULL;
   modify_item(stuff); //After this call, stuff == NULL, why?
}
19
Swiss

ポインタ値によるを渡しているためです。この関数は、ポインターのコピーで動作し、元のファイルを変更することはありません。

ポインターをポインターに渡す(つまり、struct item **)、または代わりに関数がポインタを返すようにします。

26
void modify_item(struct item **s){
   struct item *retVal = malloc(sizeof(struct item));
   retVal->element = 5;
   *s = retVal;
}

int main(){
   struct item *stuff = NULL;
   modify_item(&stuff);

または

struct item *modify_item(void){
   struct item *retVal = malloc(sizeof(struct item));
   retVal->element = 5;
   return retVal;
}

int main(){
   struct item *stuff = NULL;
   stuff = modify_item();
}
22
Doug Currie

ポインターへの参照を作成することもできます。

void modify_item(struct item* &s){
   struct item *retVal = (struct item*)malloc(sizeof(struct item));
   retVal->element = 5;
   s = retVal;
}

int main(){
   struct item *stuff = NULL;
   modify_item(stuff); //After this call, stuff == NULL, why?
    cout<<stuff->element;
    return 0;
}
0
Sumit Badsara