Процесс завершает работу с кодом -1073741819

Здравия. Какая-то проблема с выделением памяти.

#include <stdlib.h>
using namespace std;

int n = 1;
int index = 0;

struct weapon {
    string weap_name;
    string weap_type;
    int distance;
    int mag_vol;
    int fire_rate;
    string calibre;
    double bul_speed;
    double weight;
};

weapon* pointer;

void input() {
    cout << "Название: ";
    cin >> pointer[n-1].weap_name;
    cout << "Тип: ";
    cin >> pointer[n - 1].weap_type;
    cout << "Макс дист(м): ";
    cin >> pointer[n - 1].distance;
    cout << "Объем магазина: ";
    cin >> pointer[n - 1].mag_vol;
    cout << "Скорострельность(выстр/с): ";
    cin >> pointer[n - 1].fire_rate;
    cout << "Калибр(мм): ";
    cin >> pointer[n - 1].calibre;
    cout << "Скорость пули(м/c): ";
    cin >> pointer[n - 1].bul_speed;
    cout << "Вес(кг): ";
    cin >> pointer[n - 1].weight;

    n++;
}


void output(weapon* pointer) {
    cout << "Введите индекс: ";
    cin >> index;

    cout << "Название: " << pointer[index].weap_name << "\n";
    cout << "Тип: " << pointer[index].weap_type << "\n";
    cout << "Макс дист: " << pointer[index].distance << "\n";
    cout << "Объем магазина: " << pointer[index].mag_vol << "\n";
    cout << "Скорострельность: " << pointer[index].fire_rate << "\n";
    cout << "Калибр: " << pointer[index].calibre << "\n";
    cout << "Скорость пули: " << pointer[index].bul_speed << "\n";
    cout << "Вес: " << pointer[index].weight << "\n";
}

void table(weapon* pointer) {
    cout << "Индекс | Название | Тип | Макс Дист | Объем магазина | Скорострельность | Калибр | Скорость пули | Вес\n";
    for (int x = 0; x < 105; x++) {
        cout << "-";
    }
    cout << "\n";
    
    for (int x = 0; x < n; x++) {
        cout << x << " | " << pointer[x].weap_name << " | " << pointer[x].weap_type << " | " 
             << pointer[x].distance << " | " << pointer[x].mag_vol << " | "
             << pointer[x].fire_rate << " | " << pointer[x].calibre << " | "
             << pointer[x].bul_speed << " | " << pointer[x].weight << "\n";
        
        for (int y = 0; y < 105; y++) {
            cout << "-";
        }
        cout << "\n";
    }
}

void menu() {
    weapon* new_pointer;
    
    cout << "Ввод(1), Вывод по одному ружью(2), Таблица(3), Закрыть (0)\n\n";
    
    int choice = 100;
    cin >> choice;
    
    switch (choice) {
        case 1:
            cout << "\033[2J\033[1;1H";
            input();
            new_pointer = (struct weapon*)realloc(pointer, n*(sizeof(weapon)+1));
            if (new_pointer != NULL) {
                pointer = new_pointer;
            } else {
                exit(1);
            }
            
            n++;
            break;
        
        case 2:
            output(pointer);
            break;
        
        case 3:
            table(pointer);
            break;
        
        case 0:
            free(pointer);
            exit(0);
            break;
        
        default:
            cout << "\nНеверный выбор\n";
            exit(0);
            break;
    }
}

int main(void) {
    setlocale(LC_ALL, "Russian");
    
    pointer = (struct weapon*)calloc(5, sizeof(weapon));
    for (;;) {
        menu();
    }
    
    
    return 0;
}

Раньше выдавал ошибку при первом вводе после просьбы ввести "название". Не знаю в чем была проблема, но тогда в main'e до цикла у меня был malloc вместо calloc, и когда я поменял, то начало записывать в структуру данные хотя бы раз. Уже при втором вводе код нагибается на том же месте. Я вообще без понятия, в чем проблема. Через new weapon делать не вариант, препод говорит делать именно через malloc и подобные ему.

(Когда попросил другого препода помочь, он сказал, что первый живодер какой-то, потому что при работе с таким выделением памяти в неопытных руках может все поломаться, и он не знает чем тут помочь)

Я умоляю о помощи, я уже и так, и сяк перепробовал, и в нейросеть код кидал - ничего вообще не помогает.


Ответы (1 шт):

Автор решения: Harry

Как минимум ваш код не компилируется :) В нем не хватает массы #includeов... И еще - эта жуткая смесь глобальных и локальных переменных мешает чтению кода:(

Потом, наверное, вы хотели написать не n*(sizeof(weapon)+1), а (n+1)*sizeof(weapon)?

А главное — беда в смеси французского с нижегородским, а именно выделения памяти в стиле C с использованием классов C++. Вы понимаете, что у вас при всех ваших malloc/calloc/realloc не вызываются никакие конструкторы, и что у вас вместо string в памяти получается — лучше и не думать...

new/delete — вот единственно верный путь для C++

P.S. Ваш "С++" заставляет вспомнить эту байку...

Известный физик Лео С[ц]илард читал свой первый доклад на английском языке. После доклада к нему подошёл физик Джексон и спросил:
— Послушайте, С[ц]илард, на каком, собственно, языке вы делали доклад?
С[ц]илард смутился, но тут же нашёлся и ответил:
— Разумеется, на венгерском, разве вы этого не поняли?
— Конечно, понял. Но зачем же вы натолкали в него столько английских слов? — отпарировал Джексон.

→ Ссылка