Переполнение стека при объявлении массива 2 - PullRequest
3 голосов
/ 14 февраля 2011

Когда я запускаю свою программу с 1 массивом, вот так:

    int a[430][430];
    int i, j, i_r0, j_r0;
    double c, param1, param2;
    int w_far = 0,h_far = 0;
    char* magic_num1 = "";

это хорошо!

Но, когда я пишу:

    int a[430][430];
    int i, j, i_r0, j_r0;
    int nicky[430][430]; // Added line
    double c, param1, param2;
    int w_far = 0,h_far = 0;
    char* magic_num1 = "";

программане запускается с ошибкой: "переполнение стека"!Я не знаю, как это решить!

Ответы [ 5 ]

5 голосов
/ 14 февраля 2011

Вам нужно либо увеличить пространство стека (как это делается зависит от вашей платформы), либо вам нужно выделить массив из кучи, или, что еще лучше, использовать std::vector вместо массива.

2 голосов
/ 14 февраля 2011

Вы пытаетесь выделить ~ 1,48 МБ содержимого в стеке 1 , в вашей системе (и не только в ней) это слишком много.

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

1. Предполагая, что 32-битный int с.

0 голосов
/ 15 августа 2018

Чтобы избежать переполнения стека, выделите массивы в куче.

Если кто-то использует C, то выделение массива размером n в куче может быть сделано, например,

int* A = (int*) malloc(n*sizeof(int));

Но вы должны помнить, чтобы освободить эту память, когда она больше не нужна

free(A);

во избежание утечки памяти.


Эквивалентно в C ++:

int* A = new int[n];

и бесплатно с

delete [] A;

Этот сайт был полезен .

0 голосов
/ 18 февраля 2011

Локальные переменные выделяются для «стека», который является пространством хранения, используемым для нескольких целей и ограниченным определенным размером.

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

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

0 голосов
/ 14 февраля 2011

Правильным решением является использование кучи, но также обратите внимание, что вы, вероятно, обнаружите, что изменение на:

short a[430][430];
short nicky[430][430]; // Added line

устраняет переполнение в зависимости от вашей платформы.Поэтому, если 'short' или 'unsigned short' достаточно велики, это может быть вариантом.

На самом деле, даже при использовании кучи, внимательно рассмотрите тип массива, чтобы уменьшить объем памяти для большого массива.

...