Ошибка сегментации в малом (ish) 2d массиве - PullRequest
1 голос
/ 06 августа 2011

Я продолжаю получать сегментацию с помощью следующего кода.При изменении 4000 на 1000 код работает нормально.Я думаю, что у меня здесь достаточно памяти ... Как я могу это исправить?

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 4000

void initialize_mx(float mx[][MAXLEN])
{
  int i, j;
  float c=0;
  for(i=0;i<MAXLEN;i++){
  for(j=0;j<MAXLEN;j++) mx[i][j]=c;
  }
}
int main(int ac, char *av[])
{
  int i, j;
  float confmx[MAXLEN][MAXLEN];
  initialize_mx(confmx);
  return 0;
}

Ответы [ 4 ]

3 голосов
/ 06 августа 2011

Проблема в том, что вы переполняете стек.

Когда вы вызываете initialize_mx(), он выделяет пространство стека для своих локальных переменных (confmx в вашем случае). Это пространство, которое ограничено вашей ОС (проверьте ulimit, если вы используете Linux), может быть переполнено, если локальные переменные слишком велики.

В основном вы можете:

  1. Объявите confmx как глобальную переменную, как предлагает cnicutar.
  2. Динамически выделять пространство памяти для вашего массива. и передавать указатель на initialize_mx()

РЕДАКТИРОВАТЬ: только что понял, что вы все равно должны выделять пространство памяти, если вы передаете указатель, поэтому у вас есть эти две опции:)

1 голос
/ 06 августа 2011

4000*4000*sizeof(float)==64000000. Я подозреваю, что ваша операционная система может иметь ограничение на размер стека от 4 до 64 МБ.

1 голос
/ 06 августа 2011

Вы используете 4000 *4000* 4 байта в вашем стеке, если я не допустил ошибок вычислений, это 61 МБ, что много. Он работает с 1000, потому что в этом случае вы используете только 4 МБ в вашем стеке.

0 голосов
/ 06 августа 2011

Как отметили другие, smallish не маленький для auto переменных класса, которые расположены в стеке.

В зависимости от ваших потребностей, вы можете

static float confmx[MAXLEN][MAXLEN];

, который выделил бы хранилище в BSS. Возможно, вы захотите рассмотреть другую систему хранения, поскольку часто требуется только разреженная матрица, и есть более эффективные способы хранения и доступа к матрицам, где многие ячейки равны нулю.

...