char ** распределение памяти с использованием нового оператора

Я действительно сбит с толку этой ошибкой ….

    char** results = new char*[numRes];  //this is where it breaks
for(int i = 0; i < numRes; i++)
{
results[i] = new char[64];
}

Это приводит к искажению ошибки кучи. но наверняка это должно работать? Я назначаю 4 символа * списку указателей символов, чтобы я мог передавать их в функции и т. Д.

Я смотрел вокруг везде, но все они, кажется, показывают malloc и free … Я использую их в классах, поэтому я хочу придерживаться c ++ new и delete.

Может ли кто-нибудь помочь мне, пожалуйста?

0

Решение

Что вы делаете после выделения? Вы только выделяете массив символьных указателей, вы не выделяете место для каждого элемента (указатель). Если вы попытаетесь сохранить элементы в элементах, у вас возникнут проблемы.

Например, если вы хотите сохранить что-либо в результатах [0] после своего размещения, вам также необходимо выделить его. Например:

results[0] = new char[100]; // NEED TO ALLOCATE BEFORE WRITING TO results[0]!
strcpy(results[0], "Test");

Вы не можете просто скопировать в результаты [0] без выделения. То же самое верно для любого элемента результатов.

2

Другие решения

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

    int numRes = 4;
char** results = new char*[numRes];

for(int i=0; i<numRes; i++)
{
results[i] = new char;
}
1

При использовании c ++ возможно ли использовать STL? в частности, классы std :: string и std :: list или std :: vector в вашем коде? В отличие от традиционных c-строк, которые являются просто последовательностями символов в массиве памяти, строковые объекты C ++ относятся к классу со многими встроенными функциями для работы со строками более интуитивным способом и с некоторыми дополнительными полезными функциями, общими для контейнеров C ++.

#include <string>
#include <list>

std::list<std::string> results; // create a list of strings

// and populate it
results.push_back("blah");
results.push_back("blah1");
results.push_back("blah2");
...
0