2012-02-19 8 views
1

У меня есть этот код:Cant выяснить, почему программа врезаться в C

#include <stdio.h> 
#include <math.h> 

#define gridSize 400 
void main() { 
    float grid[gridSize][gridSize]; 
    short height[gridSize][gridSize]; 
    short power[gridSize][gridSize];  
} 

Я использую Visual Studio 2010, программа, кажется, аварии мгновенно, когда я запускаю его. Однако этот код:

#include <stdio.h> 
#include <math.h> 

#define gridSize 400 
void main() { 
    float grid[gridSize][gridSize]; 
    short height[gridSize][gridSize]; 
    //short power[gridSize][gridSize]; 
} 

Кажется, что все нормально работает, и программа не падает. В чем может быть проблема?

+4

Переполнение стека на StackOverflow. :) – Mysticial

+0

Каждый массив имеет 160 тыс. Элементов, и поэтому общий размер составляет 8 * 160 кБ = 1,28 МБ. Это довольно большой для стека - видимо, слишком большой! –

ответ

3

Здесь gridheight и power являются auto variable и собираетесь хранить в stack.
В любом Os каждый процесс имеет определенный фиксированный стек по умолчанию.

Здесь вы выделяете слишком много данных в стеке, поэтому у процесса нет другой оставшейся памяти в стеке для другой операции. так что врезаться

у вас есть два параметра

1> Увеличить размер стека для этого процесса

В Linux с GCC вы можете увеличить его

–stack 16777216 

добавив это в ССАГПЗ команды

2> вы можете сохранить эти данные в секции кучи, используя malloc.

2

Вы выделяете слишком много стека. Переместите один или несколько в кучу.

0

Просто прочитайте название этого веб-сайта, переполнение стека. Вы можете: 1, перенести эти три массива из основной функции (возможно, вы получите большой .exe после компиляции, если вы инициализируете эти массивы). или 2, используйте malloc().

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