(C6385) Чтение недопустимых данных из массива + Debug Error
Я пишу код для поиска простых чисел решетом Сундарама. Использовал Динамический массив. Из-за него и проблема, я считаю:
#include <iostream>
#include <chrono>
using namespace std;
// Вывод всех простых чисел до 2n решетом Сундарама.
int main()
{
setlocale(LC_ALL, "Russian");
int n;
cout << "Введите число n:" << endl;
cin >> n;
bool* nums = new bool[n + 1]; // Объявление динамического массива.
for (int i = 1; i <= n+1; i++)
nums[i] = true; // <-- Переполнение буфера при записи в "nums":
// доступный для записи объём равен "(n+1)*1" байт, однако записать можно
// только "3" байт.
int limit = (pow(2 * n + 1, 0.5) - 1) / 2;
auto start = chrono::high_resolution_clock::now();
for (int i = 1; i < limit; i++)
{
for (int j = i; j < (n - i)/(2 * i + 1); j++)
{
nums[2 * i * j + i + j] = false;
}
}
for (int m = 1; m <= n + 1; m++)
{
if (nums[m]) cout << 2 * m + 1 << endl; // <-- Чтение недопустимых данных из "nums":
// доступный для чтения объём равен "(n+1)*1" байт,
// однако считать можно только "3" байт.
}
auto end = chrono::high_resolution_clock::now();
chrono::duration<float> duration = end - start;
cout << "Длительность выполнения алгоритма: " << duration.count() << " секунд." << endl;
delete[]nums;
nums = NULL;
}
Также просто подсчитываю время его выполнения.
В конце выполнения программы вылезает ошибка:
Debug Error!
<...>
HEAP CORRUPTION DETECTED: after Normal block (#764) at
0x008655A0.
CRT detected that the application wrote to memory after end of heap buffer.
Как понимать эти два предупреждения и Debug Error?
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
bool* nums = new bool[n + 1]; // Объявление динамического массива.
for (int i = 1; i <= n+1; i++)
nums[i] = true;
По-моему, вы забыли, что в С/С++ нумерация элементов маассива начинается с 0.
Т.е. последний элемент в nums — n-й! Цикл должен иметь вид
for (int i = 0; i < n+1; i++)
nums[i] = true;
Ну и соответственно, нужно проверить все прочие обращения к массиву. Я взял в качестве примера только самое первое...