2012-01-24 2 views
0

Я получаю ошибку сегментации при выполнении следующего действия. Скажем, я определяю размер сетки следующим образом.Ошибка сегментации с переменным размером массива

#define DIM 512 

int x = DIM; 
int y = DIM; 

Теперь я хочу, чтобы выделить некоторые 2D массив с этими размерами

complex double arr[x][y]; 

Это приводит к ошибке сегментации, где, как этот вызов

complex double arr[512][512]; 

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

+0

Вы делаете это в стеке? – cnicutar

+6

Можете ли вы опубликовать полный, минимальный пример, который компилирует и демонстрирует вашу проблему вместе с любыми переключателями, которые вы передаете компилятору? – nmichaels

+0

и, конечно, вы должны показать нам, где * происходит segfault. Может быть, ваша проблема только в другом месте, только показывается здесь, потому что вы меняете какое-то произвольное условие, которое вызывает ваш segfault. –

ответ

1

При определении массива статически:

complex double arr[512][512]; 

компилятор знает, насколько она будет, поэтому он сохраняет память надлежащим образом. Тем не менее, когда вы объявляете массив переменно,

complex double arr[x][y]; 

, которые вы можете сделать это только в пределах функции, компилятор не может знать, насколько она будет, поэтому он не может зарезервировать подходящее для нее места. Пространство будет выделено в стеке, и ваш стек, очевидно, не имеет требуемого 4MB для этого массива.

Ex:

double arr1[10240][10240]; 

int main() { 
     double arr2[10240][10240]; 
     int i = 10240; 
     int j = 10240; 
     double arr3[i][j]; 
} 

arr3 вызывает Segfault при запуске, комментировать его, и он будет работать. arr1 помещается в раздел данных, arr2 помещается в стек, но стек сделан достаточно большим, чтобы удерживать его (что компилятор может сделать, так как он имеет известный размер). arr3, однако, не имеет фиксированного размера, поэтому компилятор не может зарезервировать место для него. Программа пытается выделить его в стеке, но слишком большая, поэтому выделение вызывает segfault.

+0

@nos - Исправлено, спасибо. – Kevin

+0

На самом деле, пример слишком прост, по крайней мере, для последних gcc. Вам понадобится использовать массив, чтобы вызвать segfault. –

+0

@ DanielFischer Он превзошел мои, я считаю, что это 4.4, я могу проверить, когда вернусь к работе. – Kevin

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