2015-02-16 4 views
0

Этот код должен выделять, инициализировать и печатать двухмерный массив. По какой-то причине в зависимости от значения N 4-й столбец имеет разные значения. (Все должно быть 0).Динамически выделенный 2D-массив не инициализируется

int N = 10; 
int **A; 
int i, j; 
A = malloc(N * sizeof(int *)); 
for (i = 0; i < N; i++) 
    A[i] = malloc(N * sizeof(int)); 

for (i=1;i<N;i++) 
    for (j=1;j<N;j++) 
    A[i][i]=0; 

for (i = 0; i < N; i++) { 
    for (j = 0; j < N; j++) 
    printf("%d ", A[i][j]); 
    printf("\n"); 
} 

Пример вывода:

0 0 0 0 12 0 0 
0 0 0 0 10 0 0 
0 0 0 0 8 0 0 
0 0 0 0 6 0 0 
0 0 0 0 0 0 0 
0 0 0 0 2 0 0 
0 0 0 0 0 0 0 

ответ

2
for (i=1;i<N;i++) 
    for (j=1;j<N;j++) 
    A[i][i]=0; 

должен быть

for (i=0;i<N;i++) 
    for (j=0;j<N;j++) 
    A[i][j]=0; 

Значение i и j должна начинаться с 0, а также A[i][i] должны быть A[i][j]

3

Где Вы писали

for (i=1;i<N;i++) 
    for (j=1;j<N;j++) 
    A[i][i]=0; 

использование

A[i][j]=0; 

или вы только инициализировать диагонали. А еще лучше: Используйте calloc выделить массивы:

for (i = 0; i < N; i++) 
    A[i] = calloc(N, sizeof(int)); 

тогда память придет нулевой инициализируется, и вы не будете делать ничего больше.

1
for (i=1;i<N;i++) 
    for (j=1;j<N;j++) 
    A[i][i]=0; 

Будет инициализирован только 1-й элемент A [i]. A[i][j]=0; - это то, что вы хотите здесь.

рассмотреть также с помощью MemSet инициализировать этот массив:

for (int i = 0; i < N; i++) 
    memset(A[i], 0, N * 4); // sizeof(int) = 4 
+0

'A [я]' является 'INT *', поэтому 'SizeOf (A [i]) 'здесь не будет работать. – juanchopanza

+0

кричит, что я это наблюдал. Ожидалось, что это будет int []. Я его отредактирую спасибо – Vinzenz

2

Вы только инициализацией диагональ «матрицы», для A[0][0], которая остается неинициализированным, потому что вы начинаете цикл по индексу 1 за исключением:

for (i=1;i<N;i++) 
    for (j=1;j<N;j++) 
    A[i][i]=0; 

Вам нужно

for (i=0;i<N;i++) 
    for (j=0;j<N;j++) 
    A[i][j]=0; 

или использовать memset установить все значения во внутренних массивах до 0.

for (i=0;i<N;i++) 
    memset(A[i], 0, N*sizeof(int)); 
0

Я думаю, что у вас есть ошибка в коде:

for (i=1;i<N;i++) 
    for (j=1;j<N;j++) 
    A[i][i]=0; 

должен быть

for (i=1;i<N;i++) 
    for (j=1;j<N;j++) 
    A[i][j]=0; 
Смежные вопросы