【问题标题】:C - Matrix input function gets runtime error if matrix is bigger than 5x5, but there is no size defined at the codeC - 如果矩阵大于 5x5,矩阵输入函数会出现运行时错误,但代码中没有定义大小
【发布时间】:2018-04-30 08:32:57
【问题描述】:

我正在使用这个函数来读取输入矩阵:

void leMatInt(int **M,int linhas,int colunas){
    int i, j;
    for (i = 0; i < linhas; i++){
      for (j = 0; j < colunas; j++){
        scanf("%d", &M[i][j]);
        //printf("Leu [%d, %d]\n", i, j);
      }
    }
}

我正在创建这样的矩阵:

scanf("%d", &v1);
int **matriz1=(int **)malloc(v1 * sizeof(int));
for(i = 0;i < v1; i++){
    matriz1[i] = (int *)malloc(v1 * sizeof(int));
}
leMatInt(matriz1, v1, v1);

该代码适用于 v1

【问题讨论】:

    标签: c matrix malloc


    【解决方案1】:

    matriz1 是一个双指针,所以在分配内存时你应该写sizeof(int*)。因为** pointer 将持有/包含* single 指针。

    int **matriz1 = malloc(v1 * sizeof(int*));
    for(i = 0;i < v1; i++){
        matriz1[i] = malloc(v1 * sizeof(int));
    }
    

    不鼓励对malloc() 进行类型转换。

    【讨论】:

      【解决方案2】:
      int **matriz1=malloc(v1 * sizeof(int*));
      

      双 (**) 指针变量将保存 pointer to an int。

      matriz1 是指向指针变量的指针(指向int* 的指针)。

      因此它将包含int* 变量。

      也不需要强制转换malloc 的返回类型,并检查malloc 的返回值。

      这是未定义的行为。这就是为什么它意外地适用于4,但不适用于5x5 矩阵。


      一个例子:(考虑特殊情况)-

      虽然sizeof int 是实现定义的,但通常是4 字节。但是 sizeof 指针在 64 位编译器中通常是 8 字节。

      现在要保存 5 个 int* 变量,您需要 40 字节。但是你正在分配20 字节。所以你分配的内存比你需要的少。和 访问你不被允许的内存,调用 undefined 行为。

      【讨论】:

        【解决方案3】:
        int **matriz1=(int **)malloc(v1 * sizeof(int));
        

        这条线是错误的。正如其他答案已经说明的那样,matriz1 指向的元素不是整数而是指向整数的指针,因此在此处使用带有类型名称的sizeof 应该是sizeof(int *)。

        此外,在 C 中强制转换 malloc() 的返回值和 arguably bad style 是不必要的。

        为避免此类错误,sizeof 还可以将表达式作为操作数并使用此表达式将计算的类型,这与 malloc() 一起使用非常方便——它应该如下所示:

        int **matriz1 = malloc(v1 * sizeof *matriz1);
        

        如果您稍后更改 matriz1 的类型,sizeof *matriz1 仍然会给出正确的元素大小——它是 matriz1 指向的任何对象的大小。

        【讨论】:

          猜你喜欢
          • 2013-11-30
          • 1970-01-01
          • 1970-01-01
          • 2013-12-25
          • 2013-12-20
          • 1970-01-01
          • 2018-11-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多