SIGSEV在C中填充矩阵

cngwdvgl  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(113)

我目前正在编写一个简单的代码,应该将两个矩阵相互相乘,但当我试图创建大小超过4 × 4的矩阵时,我遇到了SIGSEV。

Matrix* allocate_matrix(size_t N) {
  int i, j;
  size_t MSIZE;
  Matrix* matrix = malloc(sizeof(int*) * (N * SIZE_MULT));
  MSIZE = N * SIZE_MULT;

  if (matrix == NULL) {
    perror("Error on malloc matrix");
    exit(2);
  }

  for (i = 0; i < MSIZE; i++) {
    matrix[i] = malloc(sizeof(int) * MSIZE);

    if (matrix[i] == NULL) {
      perror("Error on malloc matrix[i]");

      for (j = 0; j < i; j++) {
        free(matrix[j]);
      }

      free(matrix);

      exit(2);
    }
  }

  #if DEBUG
  printf("Matrix allocated");
  #endif

  return matrix;
}

字符串
这是我分配内存的方式矩阵类型定义为int**

void fill_matrix(Matrix* m, size_t N) {
  size_t x;
  size_t y;
  size_t MSIZE;
  MSIZE = N * SIZE_MULT;

  for (y = 0; y < MSIZE; y++) {
    for (x = 0; x < MSIZE; x++) {
      m[y][x] = rand() % INT_LIMIT;

      #if DEBUG
      /*printf("Generated int: %d on [%ld][%ld]\n\n", m[y][x], y, x);*/
      #endif
    }
  }

  printf("Matrix filled");

  return;
}


这是插入数字到矩阵中的函数。
为一个愚蠢的问题而嘲笑别人,但我真的不知道怎么了。
代码在其中一个上运行得很好,例如,我成功地创建了一个10乘10的矩阵,但第二个矩阵一出现就崩溃了。伙计们,我需要一些提示。

ulydmbyx

ulydmbyx1#

1.不要在typedef后面隐藏指针

  1. ***pointer usually indicates erratic, bad code
    1.使用参数传递所有大小。避免奇怪的定义所有全局变量。
    1.你可以使用数组指针
    1.在sizeof中使用对象而不是类型
    1.为循环控制变量(以及所有其他变量)使用有意义的名称。
    举例说明:
void *allocate_matrix(size_t rows, size_t cols) 
{
    int *matrix = malloc(sizeof(*matrix) * rows * cols);
    return matrix;
}

void *fill_matrix(size_t rows, size_t cols, int (*matrix)[cols]) 
{
    for (size_t row = 0; row < rows; row++) 
    {
        for (size_t col = 0; col < cols; col++) 
        {
            matrix[row][col] = rand() % 1000;
        }
    }

    printf("Matrix filled\n");

    return matrix;
}

int main(void)
{
    size_t rows, cols;

    srand(time(NULL));

    rows = rand() % 20;
    cols = rand() % 20;

    int (*matrix)[cols] = allocate_matrix(rows, cols);

    if(matrix)
    {
        fill_matrix(rows, cols, matrix);
        for (size_t row = 0; row < rows; row++) 
        {
            for (size_t col = 0; col < cols; col++) 
            {
                printf("% 5d\t", matrix[row][col]);
            }   
            printf("\n");
        }
    }
    free(matrix);
}

字符串
https://godbolt.org/z/q6nffGrYx

相关问题