2009-11-20 5 views
2

Почему, если я изменяю размер одной из размерностей массива, я получаю ошибку во время выполнения: «Ошибка сегментации?». Пример:C-многомерный массив вызывает ошибку сегментации (GCC)

#include <stdio.h> 
#define DIM 8 
int main(int argc, char **argv) 
{ 
    int a[3][3][3][3][3][3][3][3][3][3][DIM], 
     b; 
    a[1][1][1][1][1][1][1][1][1][1][1] = 2; 
    b=a[1][1][1][1][1][1][1][1][1][1][1]; 
    printf("%d \n",b); 
    return 0; 
} 

Если DIM 8 не генерируется не ошибка времени выполнения, но только если DIM больше, чем 8, он вызывает ошибки времени выполнения «Сегментация Fault». Зачем ???

ответ

1
 
3*3*3*3*3*3*3*3*3*3*8 = 472392; 472392*4 /* sizeof (int) */ = 1889568 
3*3*3*3*3*3*3*3*3*3*9 = 531441; 531441*4 /* sizeof (int) */ = 2125764 

Я думаю, ваш стек ограничен 2Mbytes

7

Почти наверняка переполнение стека. Вы выделяете, что, 3^10 * 9 * sizeof(int) байтов! Вместо этого используйте int *a = (int*)malloc(N * sizeof(int)), где N - количество требуемых ints. Затем вы можете имитировать N-мерный массив.

Я объясню, как имитировать 2D-массив на 1D-массиве. Скажем, он имеет ширины строк 10. Затем вы получаете пятое значение в третьей строке, принимая a[10 * 2 + 5]. В общем, вы делаете a[width * (row - 1) + column].

Второй способ. Можно выделить массив указателей на указатели Интс:

int **a = (int**)malloc(rows * sizeof(int*)) 
for (int i=0; i<row; ++i) 
    a[i] = (int*)malloc(columns * sizeof(int)) 

... простирающийся это больше размеров в качестве упражнения для читателя.

+0

, но мне нужно 11-мерный массив и C не имеет новый операнд [] – psihodelia

+0

Вы имеете в виду использовать таНос() - это C вопрос, а не C++. – Ant

+1

@Ant: извините, исправлено. @Norma: зачем вам это нужно в первую очередь ?! Вы можете имитировать это (я добавлю это) или использовать 'int *******' ... но, серьезно говоря, у вас, вероятно, есть недостаток дизайна. – int3

1

Размер вашего массива 3^10 * 8 * sizeof (int). Предполагая 32 бит INT, SizeOf (INT) четыре байта и размер вашего массива:

3^10 * 8 * 4 = 1,889,568 bytes 

Так вы стек не так уж велик, и вы переполнением стека.

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