分配struct的矩阵

时间:2018-04-05 23:47:08

标签: c matrix struct typedef

我不知道我做错了什么。我正在尝试创建一个struct矩阵,其元素是指向此结构的指针:

typedef struct _Array
{
    short *arr;
    unsigned short size;
} Array;

我编写了一个动态分配矩阵的代码,但我收到错误,因为这行

mat[i][j]->arr = random_numbers(&mat[i][j]->size);

在下面的代码中是错误的。

Array ***mat = (Array***)malloc(5 * sizeof(Array**));
for (short i = 0; i < 5; i++) {
    for (short j = 0; j < 5; j++) {
        *(mat + i) = (Array**)malloc(5 * sizeof(Array*));
        mat[i][j]->arr = random_numbers(&mat[i][j]->size);
    }
}

random_numbers是一个返回一个随机数及其大小

的数组的函数
short *random_numbers(unsigned short* pSize)

这是我得到的错误: app.exe中0x013F17F5抛出异常:0xC0000005:访问冲突写入位置0xCDCDCDCD。

2 个答案:

答案 0 :(得分:0)

问题是你已经为指针分配了空间,但没有为结构分配空间。你否定了一些不存在的东西。

添加:

    *(mat + i) = (Array**)malloc(5 * sizeof(Array*));
    mat[i][j] = malloc(sizeof(array));  //<<-allocate sace for the struct;
    mat[i][j]->arr = random_numbers(&mat[i ][j]->size);

答案 1 :(得分:0)

  

创建一个struct矩阵,其元素是指向此结构的指针......

通常这么多层次的间接往往会让人感到困惑,应该避免。

考虑分配*pointer而不是*pointer_type的大小。正确编码,审查和维护更容易。

@PeterJ_01正确地指出mat[][]没有分配。 *(mat + i)的分配也在错误的位置。

typedef struct {
  short *arr;
  unsigned short size;
} Array;

short *random_numbers(unsigned short* pSize);

Array ***create_a_matrix(size_t rows, size_t cols) {
  Array ***mat = malloc(sizeof *mat * rows);
  for (size_t r = 0; r < rows; r++) {
    mat[r] = malloc(sizeof *(mat[r]) * cols);
    for (size_t c = 0; c < cols; c++) {
      mat[r][c] = malloc(sizeof *(mat[r][c]));
      mat[r][c]->arr = random_numbers(&mat[r][c]->size);
    }
  }
  return mat;
}

强大的代码会添加错误检查。例如:

    mat[r] = malloc(sizeof *(mat[r]) * cols);
    // Added check and clean-up
    if (mat[r] == NULL && cols != 0) {
      while (r > 0) {
        free(mat[--r]);
      }
      free(mat);
      return NULL;
    }
为了清楚起见,我更改了各种变量名称。