Void应该读取二维数组但是当它开始第二次循环时它会崩溃任何想法
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]);
}
答案 0 :(得分:1)
更改此声明
(*matrica)= malloc(sizeof(int)*(*n));
到
*matrica = malloc( sizeof( int * ) * (*n));
同时更改此循环
for (i=0;i<*n;i++)
{
for (j=0;j<*n;j++){
scanf("%d", &matrica[i][j]);
}
到
for (i=0;i<*n;i++)
{
for (j=0;j<*n;j++){
scanf("%d", &( *matrica )[i][j]);
}
答案 1 :(得分:1)
此代码中存在两个重要问题(缺少错误检查)
[]
和&
)的使用并未考虑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);
}
}
}
将一大堆错误检查作为练习给你。祝你好运。