读取二维数组时出现C错误

时间:2014-10-25 15:09:41

标签: c arrays

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]);

    }

2 个答案:

答案 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);
        }
    }
}

将一大堆错误检查作为练习给你。祝你好运。