Нарушение доступа в огромном массиве? - PullRequest
0 голосов
/ 21 мая 2019

Вот мой код:

constexpr auto array_size = 50000000; 
double M[array_size][2][20]= { };


int main()
{
    for (int n = 0; n < array_size; n++)
        printf("%d %f\n",n, M[n][0][0]);
}

Когда n печатается примерно до 150, эта программа падает.

Я также вижу ненормальное значение в M [90], оно похоже на 386721638216381263812386113....

супер длинный номер.

1 Ответ

1 голос
/ 21 мая 2019

Visual Studio обычно не позволяет выделять массивы размером более 0x7fffffff байтов с ошибкой:

error C2148: total size of array must not exceed 0x7fffffff bytes

Я предполагаю, что есть ошибка компилятора, которая препятствует обнаружению массива oversize в этом случае, и массив не инициализируется правильно.

Использование std::vector и выделение массива в куче работает:

#include <stdio.h>
#include <vector>

constexpr auto array_size = 50000000;

int main()
{
    std::vector < std::vector< std::vector< double > > > M( array_size, std::vector< std::vector< double > >( 2, std::vector< double >( 20 ) ) );
    for (int n = 0; n < array_size; n++)
        printf("%d %f\n", n, M[n][0][0]);
}

Обратите внимание, что при этом будет использовано больше, чем минимум, требуемых 16 ГБ памяти, если вам действительно нужно, чтобы все данные в памяти были одновременно, одномерный вектор может быть более эффективным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...