#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是稳定的。有人可以解释一下吗?
答案 0 :(得分:0)
在许多编译器中,数组大小确实需要在编译时预先定义。在你的情况下,你真的不知道你需要处理多少组数字(因为数字来自`scanf,这是用户输入),所以有两种方法:让数组如此之大保证用户输入永远不会超过数组的大小(有时很难做到),或者为数组动态分配一些内存。
在这种情况下,实施第二种方式。 malloc函数为数组分配一些内存(因此它的名字)。
基本上,cols = (int*) malloc (size*sizeof(int));
与说int cols[size];
几乎相同,区别在于第二种方式不是正确的方法,并且在许多编译器中不起作用,因为size
是变量。
*注意:动态与静态分配的内存之间存在另一个差异,这就是分配内存的地方。如果您有兴趣,可以自己阅读。