有人可以解释代码是如何工作的吗?

时间:2017-01-26 01:49:20

标签: c arrays dynamic 2d

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

typedef int * pinax;

int main()
{
  pinax *A;
  int size,i,j;
  int *cols;
  printf ("How many sets of numbers: ");
  scanf ("%d",&size);
  cols = (int*) malloc (size*sizeof(int));
  A = (pinax *) malloc (size * sizeof(pinax));

  //Above part i cant understand

  for (i=0;i<size;i++)
  {
     printf ("How many numbers in set %d: ",i+1);
     scanf("%d",&cols[i]);
     A[i] = malloc (cols[i]*sizeof(int));
     printf ("Give %d numbers seperated by space or newline: ",cols[i]);
     for (j=0;j<cols[i];j++)
       scanf ("%d",&A[i][j]);
  }
  for (i=0;i<size;i++) // First dimension is not stable
  {
    for (j=0;j<cols[i];j++) // Second dimension is not stable
      printf ("%d ",A[i][j]);
    printf ("\n");
  }
  return 0;
}

这是我的大学笔记,它基本上创建了一个动态的2D数组。我无法理解它是如何在我发表的评论之上起作用的。最后两条评论是我的教授,我真的无法理解为什么最后的维度2 for loops是稳定的。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

在许多编译器中,数组大小确实需要在编译时预先定义。在你的情况下,你真的不知道你需要处理多少组数字(因为数字来自`scanf,这是用户输入),所以有两种方法:让数组如此之大保证用户输入永远不会超过数组的大小(有时很难做到),或者为数组动态分配一些内存。

在这种情况下,实施第二种方式。 malloc函数为数组分配一些内存(因此它的名字)。

基本上,cols = (int*) malloc (size*sizeof(int));与说int cols[size];几乎相同,区别在于第二种方式不是正确的方法,并且在许多编译器中不起作用,因为size是变量。

*注意:动态与静态分配的内存之间存在另一个差异,这就是分配内存的地方。如果您有兴趣,可以自己阅读。