2013-09-27 3 views
3

Я проверил, что мой код правильно вырезает пространство памяти, но как только я пытаюсь инициализировать свой 2D-массив некоторыми значениями, а затем суммировать значения, я получаю ошибку сегментации только на массив 2x2. Я хотел бы в конечном итоге масштабировать мой код до гораздо большего массива, но я даже не могу заставить его работать здесь. Я знаю, что есть много сообщений о недостатке сегментации в массивах malloc и 2D, но я не смог найти тот, который помогает мне с моими проблемами, поскольку мои знания C только начинаются. Любая помощь, которую вы можете дать, или если вы можете указать мне на предыдущий вопрос, будем очень благодарны. Спасибо!Ошибка сегментации при инициализации 2D-массива

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

int main() 
{ 
    double sum=0; 
    int i,j; 
    int N = 2; 

    double **array; 
    array = malloc(N * sizeof(double *)); 

if(array == NULL) printf("Failure to allocate memory.\n"); 

for(i=0; i<=N; i++) 
    { 
     array[i] = malloc(N * sizeof(double)); 
     if(array[i] == NULL) { 
    printf("Failed to allocate memory for arr[%d].\n", i); 
    exit(0); 
    } 
    } 

for(i=0; i<=N; i++) 
    { 
    for(j=0; j<=N; j++) 
    { 
    array[i][j] = 1.0/(i+j); 
    sum = sum + array[i][j]; 
    } 
    } 

    return(0); 
} 
+0

Как правило: когда вы видите пальцы типа '<=' or '> =' в C, по крайней мере, подумайте дважды, что вы просто пытаетесь выразить. – alk

ответ

6

Вы стали жертвой одной из классических ошибок: Использование <= вместо <.

for(i=0; i<=N; i++) 

Это будет инициализировать массив [0], массив [1], и ГЛАВНОЕ массив [2] (потому что 2 < = 2), но не таНос пространство для трех указателей, только два.

Вот то, что вы хотите:

for(i=0; i<N; i++) 

Он будет перебирать массив [0] и массив [1] (в общей сложности две записи).

(не говорю, что вы не имеете другие ошибки, но это определенно один из них.)

3

Вы выделения места для массива NxN, но в ваших для циклов, вы пытаетесь доступ к массиву (N + 1) с помощью (N + 1). Вы можете заменить циклы одним из следующих способов:

for(i=0; i<N; i++) 

или

for(i=1; i<=N; i++) 

Учитывая, что вы расчета 1,0/(I + J), вы можете использовать второй, поскольку сначала будет производить деление на ноль при i = 0, j = 0. Но будьте осторожны, если вы используете второй вариант, вы должны перенести свои индексы на 1, например: массив [i-1] [j-1], потому что они всегда начинаются с 0. Лучше использовать первый вариант ,

+0

Большое спасибо за ваше четкое объяснение! Программа отлично работает сейчас (конечно!) – user2824843

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