Передача указателя struct на функцию c

У меня возникла проблема с передачей указателю на структуру функции. Мой код - это то, что показано ниже. После вызова функции 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?
}

Ответы

Ответ 1

Потому что вы передаете указатель по значению. Функция работает с копией указателя и никогда не изменяет оригинал.

Либо передать указатель на указатель (т.е. a struct item **), либо вместо него вернуть функцию указателю.

Ответ 2

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();
}

Ответ 3

Вы также можете сделать ссылку на указатель:

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;
}