Передача большого многомерного массива в функцию в C - PullRequest
1 голос
/ 28 мая 2010

У меня проблемы с передачей большого массива в функцию в C.

Я заявляю:

int image[height][width][3]={};

где высота и ширина могут быть как 1500. И когда я звоню:

foo((void *)image,height,width);

который объявлен следующим образом:

int *foo(const int *inputImage, int h, int w);

Я получаю ошибку ошибки сегментации. Что странно, если мои значения:

height=1200;
width=290;

Нет проблем, но когда они:

height=1200;
width=291;

я получаю указанную ошибку. При 4 байтах на целое число с высотой и шириной 1500 (абсолютный наихудший случай) размер массива будет 27 МБ, что не так уж и велико, и это не должно иметь большого значения, потому что я передаю только указатель на первый элемент массив. Любой совет?

Ответы [ 2 ]

3 голосов
/ 28 мая 2010

При 27 МБ ваш массив, вероятно, больше стека, который обычно составляет 1 МБ. Вы повреждаете свой процесс, как только foo начинает работать с данными. Вместо этого выделите массив в куче:

typedef int (*image_buf)[height][width][3];
image_buf image = malloc(sizeof(image_buf));
...
0 голосов
/ 12 июня 2010

Вы можете проверить размер стека процесса по умолчанию, используя 'ulimit -a' в системах Unix

   (blocks, -c) 0

размер сегмента данных (в килобайтах, -d) неограничен приоритет планирования (-e) 20 размер файла (блоков, -f) неограничен ожидающие сигналы (-i) 16382 макс заблокированная память (кбайт, -l) 64 максимальный объем памяти (кбайт, -м) неограничен открыть файлы (-n) 1024 размер трубы (512 байт, -p) 8 Очереди сообщений POSIX (байты, -q) 819200 приоритет в реальном времени (-r) 0 размер стека (в килобайтах, -s) 8192 время процессора (секунды, -t) не ограничено максимальное количество пользовательских процессов (-u) неограниченно виртуальная память (кбайт, -v) не ограничена блокировка файлов (-x) неограниченная

...