动态分配的2D阵列未初始化

时间:2015-02-16 16:05:48

标签: c arrays multidimensional-array malloc dynamic-arrays

此代码应该分配,初始化和打印二维数组。由于某种原因,取决于N的值,第4列具有不同的值。 (一切都应该是0)。

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 

5 个答案:

答案 0 :(得分: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 :(得分: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;

ij的值应从0开始,A[i][i]也应为A[i][j]

答案 2 :(得分:2)

您只是初始化&#34;矩阵&#34;的对角线,但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));

答案 3 :(得分:1)

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

仅初始化A [i]的第1个N元素。 A[i][j]=0;就是你想要的。

还考虑使用memset初始化该数组:

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

答案 4 :(得分: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;