Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как в run-time изменить размер структуры?


Автор: Chuck 20.1.2006, 15:10
Господа!
Прошу разъяснить мне, как это сделать, сабж!
Поясню, что я хочу!
Есть структура
Код

struct st_list {
    int id, update;
    string url, referrer;
};

int main()
{
    st_list *list[100];
    .....
    list = (* struct st_list)realloc(list, sizeof(st_list) * 10000);
}


Т.е. изначально задано 100 элементов структуры. Как эту сотню расширить до 1000, 10000?
Знаю, что копать нужно в сторону realloc, но что то не получается у меня. Код компилируется, но не выполняется.

Автор: Mayk 20.1.2006, 15:32
Использовать std::vector и еже с ними.
realloc - это си, а не с++.

Автор: chaos 20.1.2006, 15:49
ну а если всеже решил использовать свой метод, то тогда надо
делать так
Код

int main()
{
    st_list *list = (struct st_list *)malloc(sizeof(st_list) * 100);
    .....
    list = (struct st_list *)realloc(list, sizeof(st_list) * 10000);
}


Добавлено @ 15:52
ну а так Mayk дело говорит, зачем усложнять себе жизнь всякими маллокаи реаллоками и тп лабудой
Добавлено @ 15:55
ну и не забывай в конце делать free

Автор: azesmcar 20.1.2006, 17:01
Цитата

ну а так Mayk дело говорит, зачем усложнять себе жизнь всякими маллокаи реаллоками и тп лабудой
Добавлено @ 15:55
ну и не забывай в конце делать free


Цитата

Использовать std::vector и еже с ними.


Полностью согласен...Нет смысла в realloc..но если уж хочется так то лучше уж new, delete...твой realloc все равно тоже самое делает (сперва удаляет потом заново создает)..

Автор: blackofe 20.1.2006, 21:24
Chuck
все предыдущие ораторы дело говорят. твоя главная ошибка в том, что ты пытаешься реаллокировать память, которую ты не аллокировал (пардон мой френч):

The realloc function changes the size of an allocated memory block.

другими словами, realloc можно использовать для реаллокации памяти, предварительно аллокированной с помощью malloc, calloc, т.е. выделенной в куче.

своим же объявлением массива ты говоришь компилятору, чтобы он озаботился размещением его в стеке - скажем так, это есть са-авсем другое место smile.

ну и, если уж мы имеем в руках с++, да еще с stl, то грех этим не воспользоваться.

Автор: Chuck 22.1.2006, 11:25
Спасибо, на самом деле я просто запутался, но знал, что нужно выделять malloc-ом, просто из-за многочисленных ошибок, я упустил это!
Вот пример с изменением размера вектора
Код

#include <cstdlib>
#include <iostream>
#include <string.h>
#include <vector>

using namespace std;

struct st_list {
       int id, update;
       string url;
       };
       
int main(int argc, char *argv[])
{
    vector<st_list> list(100);
    list.resize(130);    
    list[120].url = "http://blogs.uz/";
    cout << list[120].url;
    return 0;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)