Ошибка malloc(): corrupted top size в программе на C++
Пытался сделать программу в C++, которая бы разделила char array по пробелам, и сгенерировала массив со словами из строки. Но в определённом моменте возникает ошибка:
malloc(): corrupted top size
Долго пытался решить проблему, но не смог. Вот полный код программы:
#include <iostream>
using namespace std;
int main(){
char row[] = "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua";
const int n = sizeof(row);
int words_n = 1;
for(int i = 0; i < n; i++){
if(row[i] == ' ') words_n++;
}
char **words = new char*[words_n];
int words_cntr = 0, sym_cntr = 0;
for(int i = 0; i < n; i++){
if(row[i] == ' '){
words[words_cntr] = new char[sym_cntr];
for(int j = i - sym_cntr; j < i; j++){
cout << row[j];
words[words_cntr][j] = row[j];
}
cout << endl;
words_cntr++;
sym_cntr = 0;
}
else sym_cntr++;
}
delete[] words;
return 0;
}
Ошибка возникает после нескольких итераций в цикле, на строчке:
words[words_cntr] = new char[sym_cntr]; При чём несколько слов добавляются в массив, и всё нормально, но потом что-то идёт не так...
Помогите, пожалуйста.
Ответы (1 шт):
Прокол первый, не очень принципиальный — вы выделяете
words[words_cntr] = new char[sym_cntr]
память без учета нулевого символа. Но так как вы не используете указатель на строку, это пока не так важно. Но станет очень важно при работе со строками.
А вот куда вы пишете — важно.
words[words_cntr][j] = row[j]
Обратите внимание — скажем, слово с 15 по 18 символ (образно) вы и пишете в выделенные несколько байт с 15 по 18 символ! Чему у вас равно j в words[words_cntr][j]?
Как исправить — сами разберетесь?
Кстати, а если вдруг у вас между словами будет по несколько пробелов — тогда как?
И еще — если вам годится просто массив указателей... не проще ли так? :)
int main(){
char row[] = "Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua";
const int n = sizeof(row);
int words_n = 1;
for(int i = 0; i < n; i++){
if(row[i] == ' ') words_n++;
}
char **words = new char*[words_n];
int counter = 0;
words[counter++] = row;
for(int i = 0; i < n; i++)
if(row[i] == ' ')
{
row[i] = 0;
words[counter++] = row + i + 1;
}
for(int i = 0; i < counter; ++i) cout << words[i] << endl;
delete[] words;
}