【发布时间】:2017-08-01 05:40:13
【问题描述】:
我知道有很多属于“多维数组”家族的问题。由于我找不到能解决我问题的具体问题,所以我终于要问了。
目标:存储一个二维数组,其值由用户输入。
Method-01:对数组使用任意大的初始大小。
代码:
int method_arbit()
{
int n, m;
int i, j;
float myarray[100][100];
printf("Enter the number of rows: ");
scanf("%d", &m);
printf("Enter the number of columns: ");
scanf("%d", &n);
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
scanf("%f", &myarray[i][j]);
}
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
printf("[%d][%d] = %f", i, j, myarray[i][j]);
}
}
评论:此功能按预期工作!
Method-02:使用动态内存分配。
代码:
int method_dynamic()
{
int n, m;
int i, j;
float **myarray; // m x n matrix
printf("Enter the number of rows: ");
scanf("%d", &m);
printf("Enter the number of columns: ");
scanf("%d", &n);
myarray = malloc(m*sizeof(float*));
for(i=0; i<m; i++)
myarray[m] = malloc(n*sizeof(float));
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
scanf("%f", &myarray[i][j]);
}
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
printf("[%d][%d] = %f", i, j, myarray[i][j]);
}
}
评论:此方法在接受输入时会给出分段错误。
Q1:我很难调试这个。此外,我发现更难理解这种行为背后的原因。 我对指针和动态内存分配有基本的了解。 我希望能详细解释我所犯的错误以及我可能忽略的概念。
Q2:如果我们在编译时不知道数组的大小,是否应该总是动态分配数组?
或
什么时候最好使用动态分配的数组?
我知道的一个用例是在处理函数并从它们返回数组时。
【问题讨论】:
-
第二段代码中有一个错字:当您在循环中执行
malloc时,您将超出myarray[m] = malloc(...)的范围。这里,m应该是i,就是这样。 -
请注意,第二种方法不是动态分配二维数组。
-
当数组维度大小被限制为较小的值时,像
float myarray[8][8];这样的最坏情况最大大小数组是可以的,否则分配。
标签: c arrays segmentation-fault malloc