многомерный массив в C ++ зависает - PullRequest
2 голосов
/ 12 августа 2009

Я хочу объявить массив: int a [256] [256] [256] И программа зависает. (Я уже закомментировал все остальные коды ...) Когда я пытаюсь int [256] [256], он работает нормально.

Я использую компилятор MingW C ++, Eclipse CDT.

Мой код: int main () { int a [256] [256] [256]; вернуть 0; }

Любой комментарий приветствуется.

Ответы [ 3 ]

10 голосов
/ 12 августа 2009

Это может произойти, если ваш массив является локальным для функции. В этом случае вам потребуется размер стека, достаточный для хранения 2 ^ 24 дюймов (2 ^ 26 байт или 64 МБ).

Если вы сделаете массив глобальным, он должен работать. Я не уверен, как изменить размер стека в Windows; в Linux вы должны использовать «ulimit -s 10000» (единицы измерения - КБ).

Если у вас есть веская причина не использовать глобальный (параллелизм или рекурсию), вы можете использовать malloc / free. Важно либо увеличить свой стек (не очень хорошая идея, если вы используете потоки), либо получить данные в куче (malloc / free) или сегменте статических данных (global).

В идеале вы получите завершение программы (дамп ядра), а не зависание. Я делаю в Cygwin.

0 голосов
/ 12 августа 2009

Вы хотите что-то вроде этого

#include <malloc.h>
int main()
{
    int *a;
    a = (int*)malloc(256*256*256*sizeof(int)); // allocate array space in heap
    return 0;
}

В противном случае вы получите что-то вроде этого:

альтернативный текст http://bweaver.net/files/stackoverflow1.jpg

Потому что, как уже указывали другие, в вашем коде вы размещаете массив в стеке и взрываете его.

Распределение массива через malloc или его друзей - это путь. (Создание его также глобально работает, если вы должны идти по этому пути.)

0 голосов
/ 12 августа 2009

Может быть, у вас нет 16 МБ свободной непрерывной памяти?Трудно представить, но возможно ...

...