【问题标题】:problem with 2d array mallocation (segmentation fault)二维数组错配问题(分段错误)
【发布时间】:2019-10-12 19:27:34
【问题描述】:

我试图 malloc 一个二维数组,但它 gdb 在第 8 行给了我分段错误。 if (A[i+x][j+y]!=A[i][j ].

顺便说一句:这个程序应该打印出输入矩阵的最大平方子矩阵的维数,使得它的所有数字都是相等的矩阵,使得它的所有数字都相等。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int same_surrounding(int **A, int i, int j, int size){
  for (int x=0; x<size; x++){
    for (int y=0; y<size; y++){
      if (A[i+x][j+y]!=A[i][j])
        return 0;
    }
  }
  return 1;
}

int main(){
  int n, i, j, sub, max_sub;
  int **A;

  scanf("%d", &n);
  A=malloc(sizeof*A*n);
  for (i=0; i<n; i++){
    A[i]=malloc(sizeof**A*n);
  }
  for (i=0; i<n; i++){
    for (j=0; j<n; j++){
      scanf("%d", &A[i][j]);
    }
  }
  for (i=0; i<n; i++){
    for (j=0; j<n; j++){
      sub=1;
      while (sub<n&&same_surrounding(A, i, j, sub)){
        if (sub>max_sub)
          max_sub=sub;
        sub++;
      }
    }
  }
  printf("%d", max_sub);  
  for (i=0; i<n; i++){
    free(A[i]);
  }
  free(A);
  return 0;
}

【问题讨论】:

  • same_surrounding 超出了数组的范围。不知道你想在那里做什么。
  • 谢谢。我改变了它,但它仍然给我分段错误(核心转储)。 (见后编辑)

标签: c memory-management


【解决方案1】:

这段代码主要有2个问题:

  1. 您的程序正在检查超出输入矩阵n 维度的子矩阵。例如,如果n=5i=3j=0sub=3 可以很容易地看到您的代码正在检查A[i+x][j+y] 中的数字,即直到A[5][2],它超出了A 的范围。在将其发送至same_surrounding() 之前,您需要对此进行检查。为此,您需要做的就是稍微更改 while 循环:
while (sub<=n && i+sub<n && j+sub<n && same_surrounding(A, i, j, sub)){...}
  1. 始终初始化变量。在这里,您没有初始化 max_sub 变量。当您不初始化变量时,它包含随机垃圾值。例如,如果垃圾值是478231,而您正在寻找最大的 5x5 方阵,您将永远无法达到条件if (sub&gt;max_sub),因此max_sub 将永远不会更新。这就是为什么始终使用安全值初始化变量的原因,例如 max_sub=0

另外,作为警告,您应该使用sizeof() 而不是显式写入内存分配所需的字节数。因为它们可能会根据计算机体系结构而改变。

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

Here's the working version of your code. 我所做的只是一些{ } 清理工作。如果forwhileif 等下面只有一个语句,则不需要大括号。

【讨论】:

  • 请务必将答案标记为已解决。那会帮助我! :)
猜你喜欢
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 2015-11-11
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多