Ответ 1
Потому что вы передаете указатель по значению. Функция работает с копией указателя и никогда не изменяет оригинал.
Либо передать указатель на указатель (т.е. a struct item **
), либо вместо него вернуть функцию указателю.
У меня возникла проблема с передачей указателю на структуру функции. Мой код - это то, что показано ниже. После вызова функции modify_item в основной функции stuff == NULL. Я хочу, чтобы материал был указателем на элемент struct с элементом, равным 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?
}
Потому что вы передаете указатель по значению. Функция работает с копией указателя и никогда не изменяет оригинал.
Либо передать указатель на указатель (т.е. a 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;
}