Правильный синтаксис для использования new для char * array

0

У меня есть следующее

typedef struct
{
    int        titleCount; 
    char**     titles;
} myStruct;

А потом

...
struct1->titleCount = 2;
struct1->titles = (char**) malloc(sizeof(char *) * (str->titleCount + 1));
...

Какой был бы правильный синтаксис для использования new вместо malloc?

  • 5
    Наиболее приемлемый способ - это std::vector<std::string> titles; и тогда вы все в порядке.
  • 0
    Не могу помочь Существующий код :(
Показать ещё 4 комментария
Теги:
malloc
memory-management

3 ответа

3
Лучший ответ

в этом примере заголовки указывают на массив указателей на символ или, скорее всего, на строки. Поэтому я бы ожидал чего-то вроде:

titles = new char*[str->titleCount]; // or maybe keep the +1

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

  • 0
    Это работает. Однако я могу присвоить titles 2 строки, даже не указав размер в [] . Почему так?
  • 0
    Я думаю, что если вы сделаете новый символ * [], вы получите один символ *. Возможность хранить 2 строковых указателя - это просто удача - у второго перезаписана память, которой не должно быть, что в лучшем случае приведет к неопределенному поведению, а в худшем - к аварийному завершению вашей программы.
Показать ещё 2 комментария
2

Если вы портируете с C на C++, лучшим решением будет:

std::vector<std::string> myTitles;

Вся структура не нужна.

0

Прежде всего, ваш код выделения памяти неверен, потому что вы не можете писать

struct1->titleCount 

если только вы не написали

struct struct1 *struct1 = malloc( sizeof( struct struct1 ) );

Однако из представленного вами кода кажется, что вам нужно выделить

str->titleCount + 1

элементы типа char *

Соответственно, соответствующий код будет выглядеть так:

str->titleCount = 2;
str->titles = new char * [str->titleCount + 1];

В следующий раз, пожалуйста, покажите фрагмент кода, который можно скомпилировать. Из вашего кода неясно, что такое struct1 и str. Вы только путаете других.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню