singlepost

Помогите начинающему: динамическое выделение памяти << На главную или назад  

Необходимо созадать string`овый массив с динамическо-выделяемой памятью, в прикладном программировании я новичок и прошу не судить строго, например с char можно работать следующим образом:

char *str;
if ((str = (char *) malloc(10 *sizeof(char))) == NULL)
{
Label1->Caption = "no memory!";
}
else
{
str[0] = '1';
str[1] = '2';
Label1->Caption = str[1];
free(str);
}
как работать со string? Что бы рационально использовать память? т.е я не знаю сколько памяти нужно выделить под массив с 8 элементами типа string.

36 ответов в теме “Помогите начинающему: динамическое выделение памяти”

  1. 19
    Леночка Салахутдинова ответил:

    Дорогие программисты! Думаю для вас эта прога покажется слишком легкой, но я вот не врубаюсь… Помогите, плииииииииз:)
    На С++
    Для заданной матрицы NxM (размерность с клавиатуры) определить такие k, что k строка матрицы совпадает с k столбцом.

  2. 18
    Дмитрий Щёголев ответил:

    массив стрингов это зло.и билдер тоже зло.

  3. 17
    Ogoun Er ответил:

    Необходимо созадать string`овый массив с динамическо-выделяемой памятью.
    Вот и все.. Вдруг человеку хочется знать как можно реализовать на более низком уровне.

  4. 16
    Александр Чигринец ответил:

    Эвенгар Салладорский, всё-таки совершенно непонятно, зачем городить огород и писать кучу кода, который давным-давно написан, оттестирован и оптимизирован?

  5. 15
    Александр Чигринец ответил:

    Андрей Куликов, а AnsiString это как раз не С. Другое дело, что это не std, а vcl.

  6. 14
    Ogoun Er ответил:

    Приношу извинения. код действительно построил неверно. Вот рабочий и компилирующийся экземпляр:

    class FStrings
    {
    AnsiString ** str;
    int count;
    void Inc(void);
    void Dec(void);
    public:
    FStrings();
    void Add(AnsiString st);
    AnsiString Get(int i);
    int Count(void);
    void Del(int i);
    ~FStrings();
    };

    FStrings::FStrings()
    {
    str=(AnsiString**)malloc(sizeof(AnsiString*));
    count=0;
    }

    FStrings::~FStrings()
    {
    free(str);
    }

    void FStrings::Inc(void)
    {
    count++;
    str=(AnsiString**)realloc(str,sizeof(AnsiString*)*count);
    str[count-1]=new AnsiString;
    }

    void FStrings::Dec(void)
    {
    if(count>0)
    {
    count–;
    str=(AnsiString**)realloc(str,sizeof(AnsiString*)*count);
    }
    }

    void FStrings::Add(AnsiString st)
    {
    Inc();
    (*str[count-1])=st;
    }

    AnsiString FStrings::Get(int i)
    {
    return (*str[i]);
    }

    int FStrings::Count(void)
    {return count;}

    void FStrings::Del(int i)
    {
    if(i>=0&&i<count)
    {
    for(i;i<count-1;i++)
    (*str[i])=(*str[i+1]);
    Dec();
    }
    }

  7. 13
    Андрей Куликов ответил:

    Ну возможно он всетаки С++ имел ввиду, а не С, а соответсвенно стандартный тип std::string )

  8. 12
    Александр Чигринец ответил:

    Вроде как, в С++ Builder есть AnsiString класс, соответствующий String в Delphi. Строка переменной длины. Можно просто объявить
    AnsiString data[8];
    Вся работа с памятью будет на совести VCL.

  9. 11
    Алексей Вишняков ответил:

    string в С это вроде массив char
    соответственно массив стрингов это массив массивов чаров=)))

  10. 10
    Дмитрий Щёголев ответил:

    Используй стандартные классы или поищи в гугле инфу.

  11. 9
    Evgeniy Mineyev ответил:

    Вариантов много, мне хотелось узнать мнения профессионалов!

  12. 8
    Дмитрий Щёголев ответил:

    ТЫ под чем пишешь??Билдер или Студия?

  13. 7
    Evgeniy Mineyev ответил:

    Билдер

  14. 6
    Дмитрий Щёголев ответил:

    А человек гугл не хочить почитать для начала? Вот потом программеры и пишут подобный идиотический код

  15. 5
    Дмитрий Щёголев ответил:

    Тормозит голимо спроектированный алгоритм.
    А твой код вобще не компилируется, умник

  16. 4
    Ogoun Er ответил:

    1. блоки try…catch весьма рессурсоемки и тормозят работу программы, поэтому по возможности я их не пользую.
    2. Человек просил динамическое выделение памяти, а не описание стандартных классов.

  17. 3
    Дмитрий Щёголев ответил:

    String MyStrings::Get(int ind)
    {
    if(int>=0&&ind<count)
    return arr[ind];
    return "";
    }
    ????
    Код на два балла. В данном случае надо бросать эксепшн при недопустимых индексах.
    Да и вообще валидней было бы использваоть std::vector, чем городить огород.

  18. 2
    Evgeniy Mineyev ответил:

    Я в гуманитарном учусь=) окей спасибо!

  19. 1
    Дмитрий Щёголев ответил:

    Блин ты чего С и плюсы мешаешь?? Используй new для аллоцтрования и delete для освобождения.. Чему вас только учат в вузе?

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.