Как инициализировать структуру внутри функции, которой дана переменная в качестве ссылки - PullRequest
0 голосов
/ 30 января 2020

Я все еще немного новичок в c и пытаюсь выделить часть памяти для структуры внутри функции и передать ее по ссылке.

Мое решение не работает, потому что структура Я инициализирую, там не передается другим функциям, и я получаю ошибки при попытке доступа к памяти, которая не выделена.

Вот код проблемы c:


#include <stdlib.h>

typedef struct list list;

struct list {
     int x;
};

void init_list(list* mylist){
    mylist = malloc(sizeof(list));
    mylist->x = 1;
}

void free_list(list* mylist){
    free(mylist);
}

main(){
    list mylist;
    init_list(&mylist);

    //use the value of x for something

    free_list(&mylist); 
}

Я пытался сделать this:

init_list(list* mylist){
   list *temp = malloc(sizeof(list));
   -initiliaze variables-
   *mylist = *temp
}

В этом случае другие функции могут получить доступ к структуре, но я не могу освободить ее, потому что у меня нет правильного указателя. Он просто говорит «free () недопустимый размер», когда я пытаюсь запустить его.

Так каков правильный способ выделения памяти и передачи адреса в этом случае? Также я знаю, что мог бы просто вернуть его, но я хочу знать, возможно ли это по ссылке.

Также я использую clang для компиляции.

Заранее спасибо.

1 Ответ

1 голос
/ 30 января 2020

Когда вы вызываете init_list(), он выделяет блок памяти размером struct list и устанавливает значение x равным 1. У вас все хорошо. Но у вас, похоже, есть небольшая проблема с вводом в вашу функцию. Когда вы передаете параметр в функцию в C, вы действительно передаете его копию. Изменение значения внутри функции не приводит к изменению значения обратно в main(). Это означает, что то, что вы передаете своей функции, должно быть ссылкой на то, что вы хотите, чтобы ваша функция изменилась. В этом случае вы хотите, чтобы ваша функция изменила указатель на struct list при вызове malloc(). Обходной путь, который вы ищете, выглядит примерно так:

int main(void) {
list *pointer_to_list; //declares pointer, NOT a struct
init_list(&pointer_to_list); //passes the reference value of the pointer (essentially a 'struct list**')
free_list(pointer_to_list);
}

, где init_list() определяется как:

void init_list(list **mylist) {
*mylist = malloc(sizeof(list)); //sets the pointer called pointer_to_list in main() to the ouput of malloc()
(**mylist).x = 1;

//Note that we never change the value of mylist
//because it won't change anything in main() anyway
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...