首页 > 解决方案 > 2D ARRAY (MATRIX) - 分段错误(核心转储)

问题描述

我创建了以下程序,它接受用户输入的 nxn 数组并打印它。我的代码具有三个功能,即用于二维数组的内存分配、用户数据输入和显示存储的数据。虽然 1x1 到 4x4 矩阵可以正常工作,但 5x5 及以上矩阵会导致

    Segmentation fault (core dumped)

为什么会这样?我究竟做错了什么 ?以下是我的代码-

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

int ** allocateMemory(int, int);
void createMatrix(int **, int, int);
void displayMatrix(int **, int, int);

int main()
{
  int sizeA, sizeB;

  printf("\nMatrix type(a x b): ");
  scanf("%d %d", &sizeA, &sizeB);
  printf("You entered: %d x %d\n", sizeA, sizeB);
  int ** arrayA;

  arrayA = allocateMemory(sizeA, sizeB);
  printf("\nMATRIX A\n");
  createMatrix(arrayA, sizeA, sizeB);
  displayMatrix(arrayA, sizeA, sizeB);

  getchar();
  free(arrayA);
  printf("\n");
  return 0;
}

/*-----------------------------------------*/
/* FUNCTION TO ALLOCATE MEMORY TO AN ARRAY */
/*-----------------------------------------*/

int ** allocateMemory(int r, int c)          //r - rows, c - columns
{
  int ** ptr;
  ptr = (int **) malloc(r*sizeof(int));
  for(int i = 0; i < r; i++){
    ptr[i] = (int *) malloc(c*sizeof(int));
  }
  return ptr;
}

/*-----------------------------*/
/* FUNCTION TO CREATE A MATRIX */
/*-----------------------------*/

void createMatrix(int ** array, int r, int c)
{
  printf("\nEnter matrix values: \n");
  for(int i = 0; i < r; i++){
    for(int j = 0; j < c; j++){
      scanf("%d", &array[i][j]);
    }
  }
  printf("Array Created.");
  printf("\n");
}

/*----------------------------*/
/* FUNCTION TO DISPLAY MATRIX */
/*----------------------------*/

void displayMatrix(int ** array, int r, int c)
{
  printf("\n");
  for(int i = 0; i < r; i++){
    for(int j = 0; j < c; j++){
      printf("%5d  ", *(*(array + i) + j));
    }
    printf("\n");
  }
}

标签: cpointersmultidimensional-arraysegmentation-faultcoredump

解决方案


allocateMemory()你有

ptr = (int **) malloc(r*sizeof(int));

那行是错误的,因为你想为指针数组分配内存,所以它应该是

ptr = malloc(r*sizeof(int *));

或者

ptr = malloc(r*sizeof *ptr);

如果sizeof(int) < sizeof(int *)(通常在 64 位平台上)您没有分配足够的内存来调用未定义的行为。并且“未定义”意味着任何事情都可能发生,包括代码似乎运行完美(至少对于您的情况的某些rc

无关:

您可能想了解为什么不应该转换 malloc() 的结果


推荐阅读