我不知道我做错了什么。我正在尝试创建一个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。
答案 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;
}
为了清楚起见,我更改了各种变量名称。