Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > char ** вместо *char[]


Автор: VLGeorgievich 15.6.2009, 22:35
Код

char *strings[100];
strings[0] = new char [10];
strings[1] = new char [12];


А если не известна константа, которая в данном примере равна 100. Как динамически создавать по одному указателю на char в переменной strings?

(вопрос конечно построен жутко, но объяснил как смог, может быть пойметеsmile

Автор: 586 15.6.2009, 22:39
Код
char **strings;

strings = new char*[100];
strings[0] = new char [10];
strings[1] = new char [12];
//...

//...
delete []strings[0];
delete []strings[1];
delete []strings;

Автор: VLGeorgievich 15.6.2009, 22:43
Но не обязательно строк будет 100. Их может быть как 5 так и 500. Можно ли указатели на char* создавать по одному. В этом собственно и суть моего вопроса.

Автор: ller 15.6.2009, 22:48
Код

int main()
{
    char **str;
    str = new char*[10];
    str[0] = new char[10];
    strcpy(str[0],"test\0");
    printf ("Получилось вот что %s\n",str[0]);
}

где то так

Добавлено через 2 минуты и 25 секунд
т.е. нужен динамический масив?

Код

vector<string> vstr;
vstr.push_back("Строка");


Добавлено через 3 минуты и 28 секунд
Таким образом решается куча проблем с памятью. что забудете где то, что то удалить, или наоборот удалится лишнее.

Автор: 586 15.6.2009, 22:52
Цитата(VLGeorgievich @  15.6.2009,  23:43 Найти цитируемый пост)
Их может быть как 5 так и 500.

Без проблем:
Код
char **strings;
int i = 50;   // переменная
strings = new char*[i];
strings[0] = new char [10];
strings[1] = new char [12];
//...
//...
delete []strings[0];
delete []strings[1];
delete []strings;

Цитата(VLGeorgievich @  15.6.2009,  23:43 Найти цитируемый пост)
Можно ли указатели на char* создавать по одному.

Можно... А зачем? Может нужно изменить размер массива указателей?

Автор: VLGeorgievich 15.6.2009, 22:54
До этого места я доходил. Дальше - больше. А если в процессе выполнения программы необходимо досоздать еще 10 указателей на char*.
Что то типа
Код

    char **str;
    str = new char*[10];
    (str+10) = new char*[10];

это вообще неправильный код, но я думаю может он отразит суть проблемы

Добавлено через 1 минуту и 6 секунд
Цитата

Можно... А зачем? Может нужно изменить размер массива указателей?


А как это сделать. Это именно то что мне нужно.

Добавлено через 4 минуты и 51 секунду
А если использовать собственный класс

Код

vector<MyClass> vstr;
vstr.push_back(!!! Здесь как я понимаю параметры конструктора !!!);

Автор: 586 15.6.2009, 23:02
Цитата(VLGeorgievich @  15.6.2009,  23:54 Найти цитируемый пост)
А если в процессе выполнения программы необходимо досоздать еще 10 указателей на char*.

Это называется изменение размера динамического массива.
Для этого нужно создать новый массив, скопировать значения указателей из старого массива указателей в новый массив указателей, удалить старый массив и досоздать оставшиеся 10 указателей.

Если для тебя это сложно, используй std::vector.

Автор: ller 15.6.2009, 23:02
Код

vstr.push_back(!!! Здесь как я понимаю параметры конструктора !!!);

Нет, здесь значение, которое заталкиваешь

Автор: VLGeorgievich 15.6.2009, 23:25
Я понял надо делать так:

Код

   char *strings[100];
   strings[0] = new char[10];
   strings[1] = new char[54];
   ...


Если понадобиться увеличить массив то создаю новый, копирую значения, удаляю старый и досоздаю новые указатели.

Грамотен ли данный код, либо фигня какая-то получилась и можно сделать много проще и лучше?smile

Добавлено через 1 минуту и 26 секунд
(хочу первый раз в жизни сделать программу по умуsmile)

Автор: ller 15.6.2009, 23:32
Иначе динамические массивы не работают. Только выделять память можно с запасом, чтоб часто не перераспределять.

Автор: 586 15.6.2009, 23:36
Код
char **strings, **tmp;
int n = 50, nn;

strings = new char*[n];
for(int i = 0; i < n; ++i)
    strings[i] = new char[32];

// перевыделение памяти
  nn = 100;   // новый размер массива
  tmp = new char *[nn];    // новый массив
  for(int i = 0; i < n; ++i)    // копирование указателей
      tmp[i] = strings[i];

  for(int i = n; i < nn; ++i)  // досоздание указателей
      tmp[i] = new char[32];

  delete []strings;              // удаление старого массива
  strings = tmp;
  n = nn;
//


Автор: VLGeorgievich 16.6.2009, 00:22
ller и 586, благодарю.

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