2014-03-22 1 views
3

Я хочу знать, сколько чисел вы можете хранить в массиве?Возможно ли хранить в памяти 10 миллионов номеров?

srand (time(NULL)); 
int array[10000000]; 
for(int i = 0; i < 10000000; i++){ 
    array[i] = (rand() % 10000000) + 1; 
} 

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

Итак, я хочу знать, сколько чисел я могу хранить в массиве или что-то не так с моим кодом?

+5

В зависимости от размера стека. Кроме того, вы должны использовать заголовок '' для псевдослучайных чисел. – chris

+1

Является ли это только тем, что читает этот вопрос, и предполагает, что д-р Злой говорит: «Я хочу хранить 10 МИЛЛИОНОВ НОМЕРОВ», пока он крутит палец в уголке рта? http://i.imgur.com/h27654L.jpg – mah

ответ

12

Вы можете хранить столько чисел, сколько у вас есть память, но вы не можете сделать это так. Причина, по которой происходит сбой вашей программы, заключается в том, что вы используете «автоматическую» переменную, которая выделяется в «стеке». Стек гораздо более ограничен по размеру, чем «куча», как правило, поэтому использование автоматических переменных такого большого размера может привести к ... ожиданию ...

STACK OVERFLOW!

Вместо этого, попробуйте следующее:

int* array = new int[10000000]; 

Затем после ее использования:

delete[] array; 

Шаг два будет узнать о смарт-указатели; вы можете использовать что-то вроде boost::scoped_array для этого случая, но есть много вариантов в зависимости от того, какие библиотеки вы предпочитаете (или если у вас есть C++ 11).

Если у вас есть C++ 11, вы можете использовать «RAII», чтобы избежать необходимости запоминать, когда и где нужно удалить delete. Просто сделайте это, чтобы выделить массив:

std::unique_ptr<int[]> array(new int[10000000]); 

Или просто использовать вектор, который всегда выделяет его содержимое динамически («в куче», грубо говоря):

std::vector<int> array(10000000); // 10000000 elements, all zero 
4

язык больше способный хранить в массиве 10 000 000 значений. Проблема здесь заключается в том, что вы заявили, что 10 000 000 элементов существуют в стеке. Размер стека зависит от реализации, но большинство стеков просто не хватает места для множества элементов. Куча - гораздо лучшее место для такого массива.

int* array = new int[10000000]; 
for(int i = 0; i < 10000000; i++){ 
    array[i] = (rand() % 10000000) + 1; 
} 
... 
delete[] array; 
+0

Спасибо, сейчас это работает . – user3127680

0

Есть пара мест, в которые вы можете поместить свой массив в память. Самая распространенная разница, о которой мы думаем, это стек и куча .

Стек - это то, как компьютер отслеживает, какую функцию вы используете, как вернуться из функции и локальные переменные. Он часто ограничен. Точный лимит зависит от вашей платформы и, возможно, от того, как вы скомпилировали свою программу.

Куча - это еще одна область памяти, где компилятор обычно хранит то, что вы выделили, с ключевым словом new. Это часто намного больше и способно хранить большой массив, такой как ваш. Недостатком того, чтобы держать вещи в куче, является то, что вы должны помнить до delete их в соответствующее время.

В вашем примере вы объявляете массив элементов размером 10000 000 в стеке.Если вы хотите, чтобы объявить, что массив в куче, вы могли бы сделать это следующим образом:

srand (time(NULL)); 
int* array = new int[10000000]; 
for(int i = 0; i < 10000000; i++){ 
    array[i] = (rand() % 10000000) + 1; 
} 

//Sometime later... 
delete[] array; 

Однако, C++ дает нам лучшие инструменты для этого. Если вы хотите большой массив, используйте std::vector.

srand (time(NULL)); 
std::vector<int> array(10000000); 
for(std::size_t i = 0; i < array.size(); i++){ 
    array[i] = (rand() % 10000000) + 1; 
} 

Теперь ваш std::vector находится в стеке, но память он управляет на куче. Вам не нужно забывать удалять его позже, и ваша программа не сбой.

+0

На самом деле существует более двух: 1) Глобальная секция переменных, которая не является ни стеком, ни кучей. 2) Постоянная область данных, которая может быть постоянной памятью, часто является той же областью, что и исполняемый файл. 3) Stack, который многие компиляторы используют для хранения локальных переменных функции. 4) Куча, которую многие компиляторы используют для хранения динамически распределенных переменных. 5) Файлы или внешняя память. –

+0

Спасибо @ThomasMatthews! Я не думал об этом. Я отредактировал сообщение, чтобы быть немного более ясным. – Collin

+0

@ThomasMatthews Не можем ли мы сделать массив статическим, я попробовал его работать, есть ли какие-то недостатки, кроме того, что он должен быть определенного размера, определенного перед запуском? –

Смежные вопросы