我注意到我缺乏动态2D数组的知识,在阅读了这里和周围的网络的一些主题后,我尝试了一些东西,但它似乎没有正确的行为:我想分配一个3X3的整数数组,输入值到它并显示它们,问题是,总是在我在[3][1]
的索引处输入值后,程序崩溃了……这很奇怪,因为我认为我做的每件事都是正确的。我也想听听你关于检查内存分配失败的想法,(!(array))
足够好的方法吗?我还看到了一些在故障点(如果发生故障)之前释放内存的例子。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j, //loop control
**array, //pointer to hold the 2D array
N = 3; //rows and columns quantity
array = malloc (N * sizeof (int*)); //allocating rows
if (!(array)) //checking for allocation failure
{
printf("memory allocation failed!n");
goto exit;
}
else
{
array [i] = calloc (N, sizeof (int)); //allocating columns
if (!(array[i])) //checking for allocation failure
{
printf("memory allocation failed!n");
goto exit;
}
}
for (i = 0; i < N; i++) //getting user input
{
for (j = 0; j < N; j++)
{
printf("Enter value [%d][%d]:", i+1, j+1);
scanf ("%d", &array [i][j]);
}
}
for (i = 0; i < N; i++) //displaying the matrix
{
printf("n");
for (j = 0; j < N; j++)
{
printf (" %d", array [i][j]);
}
}
exit:
return 0;
}
你有几个问题。
- 您正在使用未初始化的
i
。 -
您没有为所有行分配内存。下面的行只能为一行分配内存。
array [i] = calloc (N, sizeof (int)); //allocating columns
你需要什么:
代替
array [i] = calloc (N, sizeof (int)); //allocating columns
if (!(array[i])) //checking for allocation failure
{
printf("memory allocation failed!n");
goto exit;
}
使用for ( i = 0; i < N; ++i )
{
array [i] = calloc (N, sizeof (int)); //allocating columns
if (!(array[i])) //checking for allocation failure
{
printf("memory allocation failed!n");
goto exit;
}
}
你很幸运之前没有崩溃。您只分配了3x3矩阵的一行:
array [i] = calloc (N, sizeof (int)); //allocating columns
if (!(array[i])) //checking for allocation failure
{
printf("memory allocation failed!n");
goto exit;
}
您需要对矩阵的每一行执行此操作,而不仅仅是一次。
此外,当调用calloc
时,i
的值是未定义的。将上面的代码块包装在一个底循环中应该可以解决你的问题:
else
{
for (i = 0; i < N; i++) {
array [i] = calloc (N, sizeof (int)); //allocating columns
if (!(array[i])) //checking for allocation failure
{
printf("memory allocation failed!n");
goto exit;
}
}
}