Void 应该读取二维数组,但是当它开始第二个 i 循环时它会崩溃
void skaitymas(int ***matrica, int *n)
{ int i,j,o,g,k;
printf("Iveskite eiluciu ir stulpelius skaiciu \n");
scanf("%d",n);
(*matrica)= malloc(sizeof(int)*(*n));
for(i=0; i<*n; i++)
(*matrica)[i] = malloc(sizeof(int)*(*n));
for (i=0;i<*n;i++)
{
for (j=0;j<*n;j++){
scanf("%d", &matrica[i][j]);
}
最佳答案
你在这段代码中有两个重大问题(缺乏错误检查无法承受)
- 您对取消引用和地址运算符(
[]
和&
)的使用没有说明 operator precedence .您还缺少对刚在外部分配中设置的指针的基本取消引用。 - 根据指定的类型 (
int
) 为您分配大小,而不是将sizeof
与指定的指针变量 结合使用。在这种情况下,您指定的类型 (int
) 和您尝试加载的类型 (int*
) 不相同.
关于第一行,这一行:
scanf("%d", &matrica[i][j]);
应该生成这个警告,告诉你有什么不对:
main.c:20:25: Format specifies type 'int *' but the argument has type 'int **'
或类似的东西。如果您没有看到这一点,请调高您的警告级别。无论如何,查看 operator precedence表。
关于第二期,这一行:
(*matrica)= malloc(sizeof(int)*(*n));
将愉快地分配您请求的内存量,如果您(不)幸运,分配的项目的大小 (int
) 与指针的基础类型的大小 (int*
).更好的方法是在分配语句中结合使用指针变量和 sizeof
(*matrica)= malloc(sizeof(**matrica)*(*n));
考虑到以上两项,利用指针算术加载行值,并将行分配与行读取集成在一起,一种实现可能如下所示:
void skaitymas(int ***matrica, int *n)
{
int i,j;
*matrica = NULL;
printf("Iveskite eiluciu ir stulpelius skaiciu \n");
if (scanf("%d",n) == 1 && n > 0)
{
*matrica = malloc(*n * sizeof(**matrica));
for (i=0; i<*n; ++i)
{
(*matrica)[i] = malloc(*n * sizeof(***matrica));
for (j=0; j<*n; ++j)
scanf("%d", (*matrica)[i]+j);
}
}
}
将大量错误检查作为练习留给您。祝你好运。
关于读取二维数组时出现C错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26563844/