構造体へのポインタを関数に渡すときに問題が発生します。私のコードは基本的に以下に示すものです。メイン関数で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?
}
ポインタ値によるを渡しているためです。この関数は、ポインターのコピーで動作し、元のファイルを変更することはありません。
ポインターをポインターに渡す(つまり、struct 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);
または
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();
}
ポインターへの参照を作成することもできます。
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;
}