2013-11-09 2 views
0

Из этого алгоритма возникает ошибка сегментации (ядро сбрасывается). Зачем?Язык ошибки сегментации c

Работает ли он при использовании небольшого значения N и K? Например, N = 100 и K = 10?

#include <stdio.h> 
#include <stdlib.h> 

#define N 400  
#define K 30   

int main() 
{ 
int i,j,k; 
int A[K+1][N][N]; 
for (i=0;i<K+1;i++) 
{ 
    for (j=0;j<N;j++) 
    { 
     for (k=0;k<N;k++) 
     { 

      A[i][j][k]=0; 
     } 

    } 
} 
printf("A[%i][%i][%i] \n", i, j,k); 
printf("OK"); 
return 0; 
} 
+1

'Е («А [% я] [% я] [% я] \ п», я , j, k); 'должно быть с'% d' (это не вызывает ошибки, просто подсказка). – pzaenger

+0

Um, '% i' и'% d' эквивалентны. –

ответ

6

Вероятно, вы превысите размер стека.

Если вы используете большие значения для K и N, рассмотрите вопрос о помещении A в кучу.

int *A = malloc((K+1) * N * N * sizeof(int)); 

Индексировать в него:

A[(i*(K+1) + j)*N + k]=0; 

(вы сделать хотите сделать функцию или макрос для этого)

И как только вы закончите с A,

free(A); 
+0

Мой ответ был неправильным, ваш правильный. Я неправильно читаю код. –

+0

@CharlieBurns, да, хотя (на удивление) вы получили два ответа на ваш ответ;) –

+0

почему бы ему не быть: 'int * A = malloc (sizeof (int) * (K + 1) * N * N); '? – ryyker

2

Вы пытаетесь создать массив размером 19,2 МБ (31 * 400 * 400 * 4), где 4B - размер типа int. Невозможно статически выделить более 8.37MB, вместо этого используйте malloc.

+0

Возможно, вы имели в виду * not * possible? Размер стека варьируется (широко). –

+0

В Windows стек по умолчанию составляет 1 МБ. – Havenard

+0

@PaulDraper: Я ожидаю, что он думал о 'static int A [K + 1] [N] [N];' либо в области файлов или функций. Поскольку они не находятся в стеке, не удаляйте стек, в отличие от стандартных (для обычных машин) распределения автоматических локальных переменных. –

0

Другой способ заключается просто переместить массив из стека и в сегмент данных:

#include <stdio.h> 
#include <stdlib.h> 

#define N 400  
#define K 30   
int A[K+1][N][N]; // ADD THIS LINE 

int main() 
{ 
int i,j,k; 
// REMOVE THIS LINE int A[K+1][N][N]; 
for (i=0;i<K+1;i++) 
{ 
    for (j=0;j<N;j++) 
    { 
     for (k=0;k<N;k++) 
     { 

      A[i][j][k]=0; 
     } 

    } 
} 
printf("A[%i][%i][%i] \n", i, j,k); 
printf("OK"); 
return 0; 
} 
Смежные вопросы