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

标签 c arrays

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/

相关文章:

c++ - 操作系统和编译器如何通信以启动程序编译

javascript - 数组的索引可以是数组吗?

java - 如何在 Java 中将 double 组转换为整数数组?

php - 在 PHP 中处理大量非常大的文件

c - getch() 和 getchar() 有什么区别?

c - 如何保存和比较 boolean 可满足性表达式中的值?

c - 获取用户输入的第一个字符,丢弃 c 中的其余字符

c - 这些语法的含义(指针算术?)

javascript:带有对象的公共(public)数组

python - 将 numpy 数组的列与另一个数组相加和相乘