在运行时初始化2d数组并允许用户输入

时间:2017-04-24 10:51:31

标签: c multidimensional-array malloc

printf("\nNow its time to make a custom array. Please enter the number of rows: ");
int rows = scanf_s("%d", &rows);
printf("Now enter the number of columns: ");
int cols = scanf_s("%d", &cols);

int **custom2d;

custom2d = malloc(sizeof(int) * rows);

for (int i = 0; i < rows; i++)
{
    *(custom2d + i) = malloc(sizeof(int) * cols);
}

for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < cols; j++)
    {
        printf("Enter value for [%d][%d]: ", i, j);
        scanf_s("%d", custom2d[i][j]);
    }
}

我是C的新手,但我知道其他几种更高级别的语言。我无法理解为什么这段代码不起作用。当我到达索引处输入数组值的提示时,我得到一个异常(访问冲突写入位置)。我很迷茫。我要做的就是允许用户指定行,列,然后在数组的每个位置输入一个值。

2 个答案:

答案 0 :(得分:3)

更改此部分:

int **custom2d;

custom2d = malloc(sizeof(int) * rows);

for (int i = 0; i < rows; i++)
{
    *(custom2d + i) = malloc(sizeof(int) * cols);
}

到:

int **custom2d;
custom2d = malloc(sizeof(int*) * rows);
if (custom2d == NULL)
{ 
    printf ("Error");
    return;
}
for (int i = 0; i < rows; i++)
{
    *(custom2d + i) = malloc(sizeof(int) * cols);
    if (custom2d[i] == NULL)
    {
        printf ("Error");
        return;
    }
}

请参阅this link,了解为何应检查malloc的结果。也改变:

scanf_s("%d", custom2d[i][j]);

到:

scanf_s("%d", &custom2d[i][j]);

最后改变:

int rows = scanf_s("%d", &rows);

int cols = scanf_s("%d", &cols);

到:

int rows;
scanf_s("%d", &rows);

int cols;
scanf_s("%d", &cols);
分别为

,现在您使用的是scanf_s的返回值,而不是读取的值。

答案 1 :(得分:1)

您需要分配一个指针数组(int *)而不是int

custom2d = malloc(sizeof(int *) * rows); 

然后为了更具可读性,imho,你也可以这样做:

custom2d[i] = malloc(sizeof(int) * cols);

在这两种情况下,你应该检查分配是否已经完成:

   if (custom2d == NULL)
        printf ("No allocation made");

   if (custom2d[i] == NULL)
        printf ("No allocation made");

此外,您需要将指针传递给scanf_s

scanf_s("%d", &custom2d[i][j]);

更新

您还需要更改此内容,因为scanf_s会返回成功转换并分配的字段数

int rows;
scanf_s("%d", &rows);

int cols;
scanf_s("%d", &cols);