Как получить элементы из списка в структуре по указателю

Marek Szmalc спросил: 10 мая 2018 в 04:09 в: c++

У меня есть простая структура с int, и я хотел бы отображать элеммы с помощью указателя. Я хотел бы сделать что-то вроде этого

for(int i = 0; i<x*y; i++){
        std::cout << parr->elems[i];   }

Здесь показаны странные цифры, такие как 126514360, он должен показывать 0s

struct MyStruct {
    size_t x;
    size_t y;
    int* elems;
};MyStruct* createMyStruct(size_t nr, size_t nc, int e = 0){
    int how_many = nr*nc;
    int my_list[how_many];
    for(int i=0; i<how_many; i++){
        my_list[i] = e;
    }
    MyStruct obj;
    obj.x=nr;
    obj.y=nc;
    obj.elems = my_list;
    return &obj;
}void getElemsFromMyStruct(const MyStruct* parr) {
    int x = parr->x;
    int y = parr->y;    for(int i = 0; i<x*y; i++){
        std::cout << parr->elems[i];    }
}int main() {
    MyStruct* a = createMyStruct(2, 3, 1);    //it should show elems from MyStruct.elems
    getElemsFromMyStruct(a);
    return 0;
}

2 ответа

Есть решение
hauron ответил: 10 мая 2018 в 04:18

Функция createMyStruct возвращает адрес локальной переменной, созданной в стеке. Как только функция заканчивается, стек распадается, и переменная будет уничтожена.

Кроме того, MyStruct в той же самой функции задано сохранение адреса локального массива с помощью obj.elems = my_list. Это также удаляется, когда функция заканчивается.

Я бы рекомендовал читать в стеке против кучи в C / C ++. Кроме того, обратите внимание, что это сильно отличается от управляемых языков, таких как Java / C #, где будет работать аналогичный подход.

Annabelle ответил: 10 мая 2018 в 04:21

Вам необходимо создать MyStruct в вашей функции createMyStruct(), используя новый указатель, чтобы он не разрушался. Выполнение этого результата приводит к следующему выводу: 100000.

MyStruct* createMyStruct(size_t nr, size_t nc, int e = 0){
    int how_many = nr * nc;
    int my_list[how_many];
    for(int i=0; i<how_many; i++){
        my_list[i] = e;
    }
    MyStruct *obj = new MyStruct;
    obj->x=nr;
    obj->y=nc;
    obj->elems = my_list;
    return obj;
}

Дополнительное видео по вопросу: Как получить элементы из списка в структуре по указателю

C++. Односвязный список с использованием указателей

Структуры C++. Урок 3. Эффективная сортировка массива структур через указатели. Struct

Реализация односвязного списка c++ Часть 1 | Урок #133