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