【问题标题】:Dynamically Allocated 2D-Array not initializing动态分配的二维数组未初始化
【发布时间】:2015-02-16 16:05:47
【问题描述】:

这段代码应该分配、初始化和打印一个二维数组。由于某种原因,取决于 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 

【问题讨论】:

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


    【解决方案1】:

    你写的地方

    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));
    

    然后内存将被零初始化,你将不再需要做任何事情。

    【讨论】:

      【解决方案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]

      【讨论】:

        【解决方案3】:

        您只是在初始化“矩阵”的对角线,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));
        

        【讨论】:

          【解决方案4】:
          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
          

          【讨论】:

          • A[i]int*,所以 sizeof(A[i]) 在这里不能很好地工作。
          • 哎呀我监督了。期望它是一个 int[]。我会编辑它谢谢
          【解决方案5】:

          我认为你的代码有错误:

          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;
          

          【讨论】:

            猜你喜欢
            • 2012-01-27
            • 2014-01-07
            • 1970-01-01
            • 2020-10-30
            • 2012-07-12
            • 1970-01-01
            • 1970-01-01
            • 2016-04-23
            • 1970-01-01
            相关资源
            最近更新 更多