Инициализация структуры и назначение ее параметров внутри функции - PullRequest
0 голосов
/ 07 марта 2019

Я немного искал и не могу найти точного ответа на свой вопрос.Кажется, что это должно работать, но это не так.Вот мой код:

typedef struct stack_strut {
    Item* top;
    int size;
}stack;

void initialize(stack* s) {
    s = (stack*)malloc(sizeof(stack));
    s->size = 0;
}

int main() {
    stack s;
    initialize(&s);
    return 0;
}

Это сжатая версия, очевидно.У меня сложилось впечатление, что я смогу изменить содержимое структуры, так как я передаю указатель на нее, поэтому изменение внутри функции должно остаться после его возврата.Если я использую оператор print внутри функции initialize для проверки размера, он успешно печатает 0. Однако, если я использую другой оператор print в main сразу после инициализации, размер s теперь очень большой.Это потому, что я не инициализировал s вне функции?Я должен сохранить его в этом формате, потому что основная функция, предоставляемая моим профессором, запускается таким же образом:

stack s;
initialize(&s);

1 Ответ

0 голосов
/ 07 марта 2019

Проблема в том, что когда вы пишете s = (struct*)malloc(sizeof(strucy));, он перезаписывает указатель на s, и вы не инициализируете «хороший» объект.Вы создали другой и инициализировали его (память просочилась).Вы можете проверить, напечатав значение

Malloc не требуется, поскольку стек s уже выделен в основном

#include <iostream>

struct Item {
    int nodeId;
};

struct stack {
    Item* top;
    int size;
};

void initialize(stack *s)
{
    std::cout << "initialize 1. stack at " << s << std::endl;
    s = (stack*)malloc (sizeof(stack));
    std::cout << "initialize 2. stack at " << s << std::endl;
    s->size = 0; 

}

int main() {
    stack s;
    std::cout << "main 1. stack at " << &s << std::endl; 
    initialize(&s);
    std::cout << "main 2. stack at " << &s << std::endl; 
    return 0;
}

будет выводить (см. Инициализировать 2.)

main 1. stack at 0x7ffca7c72520
initialize 1. stack at 0x7ffca7c72520
initialize 2. stack at 0x5566830b0280
main 2. stack at 0x7ffca7c72520
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...