24

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

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?
}
4

3 に答える 3

33

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

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

于 2012-04-08T21:32:57.693 に答える
32
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();
}
于 2012-04-08T21:34:31.723 に答える
0

関数「modify_item」が引数として渡される構造体のメンバーを変更する場合は、以下のようにコードを変更することをお勧めします。

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

int main(){
   struct item *stuff = malloc(sizeof(struct item));
   modify_item(stuff); 
}
于 2021-06-07T08:20:33.173 に答える