Пишет что повредил кучу? Чего?

Понятие "повреждение кучи" относится к программированию на языке C и связано с неправильной работой с памятью и динамическим выделением памяти.

В языке C память может быть выделена из кучи (heap) с помощью оператора malloc или calloc, а затем освобождена с помощью оператора free. Вероятность повреждения кучи возрастает, когда программист допускает ошибки в управлении памятью.

Существует несколько типичных способов, которыми могут быть повреждены данные в куче:

1. Неправильная арифметика указателей: это может произойти, когда указатель, содержащий адрес блока памяти в куче, изменяется так, что указывает на другой блок памяти или на невыделенную область памяти. Это может привести к утечкам памяти или к перезаписи данных других переменных.

Пример:

int *ptr = (int*)malloc(10 * sizeof(int));
int *wrongPtr = ptr + 20;  // Неправильное сложение указателей

2. Утечка памяти: это происходит, когда вы не вызываете оператор free для выделенного блока памяти, и блоки памяти не освобождаются. Утечка памяти может привести к исчерпанию ресурсов памяти и прекращению работы программы.

Пример:

void func() {
    int *ptr = (int*)malloc(10 * sizeof(int));
    // Забыт вызов оператора free(ptr);
    return;
}

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

Пример:

int *ptr = (int*)malloc(10 * sizeof(int));
free(ptr)
*ptr = 5; // Использование освобожденного указателя

4. Неправильное освобождение: это может произойти, когда пытаетесь освободить блок памяти несколько раз, освободить часть блока памяти, которая не была выделена с помощью malloc или calloc, или освободить указатель на невыделенную область памяти. Неправильное освобождение может привести к нестабильной работе программы или к "уничтожению" других блоков в куче.

Пример:

int *ptr1 = (int*)malloc(10 * sizeof(int));
free(ptr1);
free(ptr1); // Неправильное освобождение блока памяти

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