Куча была повреждена

79
03 апреля 2022, 18:20

При компилировании выдает ошибку Вызвано исключение по адресу 0x77C7F94D (ntdll.dll) в test2.exe: 0xC0000374: Куча была повреждена (параметры: 0x77CBB960). Необработанное исключение по адресу 0x77C7F94D (ntdll.dll) в test2.exe: 0xC0000374: Куча была повреждена (параметры: 0x77CBB960). Я понимаю что ошибка в функции strcat, но не могу понять по чему

#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
int main()
{
    const char* Path = "D:\\SQLite\\";
    char oldname[] = "1.txt";
    char newname[] = "2.txt";
    const char* NewPath = "D:\\";
    char* Files = new char[strlen(Path) + strlen(oldname)+1];
    strcat(Files, Path);
    strcat(Files, oldname);
    cout<<Files;
    return 0;
}
Answer 1

Итак, поехали. Не компилировать, а выполнять.

char* Files = new char[strlen(Path) + strlen(oldname)+1];

Без проблем, менеджер памяти выделил место в памяти и отдал его вам. Само собой, никак его не чистя (вы же не говорили, что его надо инициализировать?). И там лежит, например, что-то вроде

asdgysyh782qy6yr76786bxstgq748qs67576529187%*^%$@!VFGG&%&T#@

Словом мусор. К которому вы ДОБАВЛЯЕТЕ свою строку. Приписываете ее в конец. Который может оказаться далеко за пределами выделенной памяти:

strcat(Files, Path);

Почему бы вам не СКОПИРОВАТЬ первую часть новой строки?

strcpy(Files, Path);

Вопрос не риторический - мне действительно интересно, неужели там, откуда вы узнали о strcat (на лекции, из книги...) ничего не было сказано сначала о strcpy?

READ ALSO
Заполнение колонки на основе соседней

Заполнение колонки на основе соседней

Подскажите пожалуйста, по решению вопросаУ меня есть колонка STATE (boolean), добавил колонку NAME (varchar)

122
Wordpress создание своей таблицы

Wordpress создание своей таблицы

Кто не будь знает по какой причине не работает конструкция

188
Обновление UI JavaFX во время выполнения

Обновление UI JavaFX во время выполнения

Есть LabelЯ хочу получить следующий алгоритм:

233