我有这个 typedef
和 struct
:
typedef double mat[MAT_SIZE][MAT_SIZE];
typedef struct matList {
char *name;
mat *matrix;
} matList;
我为我的结构创建了一个 pointers 数组:
mat MAT_A, MAT_B, MAT_C, MAT_D, MAT_E, MAT_F;
matList *mats[MAT_COUNT];
int i;
for (i = 0; i < MAT_COUNT; i++) {
mats[i] = NULL;
}
mats[0] = create_mat("MAT_A", &MAT_A);
mats[1] = create_mat("MAT_B", &MAT_B);
mats[2] = create_mat("MAT_C", &MAT_C);
mats[3] = create_mat("MAT_D", &MAT_D);
mats[4] = create_mat("MAT_E", &MAT_E);
mats[5] = create_mat("MAT_F", &MAT_F);
我的 create_mat
函数如下所示:
matList *create_mat(char *name, mat *curMat) {
matList *tempMat = (matList *)malloc(sizeof(matList));
if (tempMat != NULL) {
tempMat->name = name;
tempMat->matrix = curMat;
return tempMat;
}
free(tempMat);
tempMat = NULL;
return NULL;
}
我正在尝试进入二维数组并将 0 放入所有单元格中,但它不起作用:
- 有时我有一个核心转储(但它成功放置了 0)
- 有时我没有得到核心转储,但我在所有单元格中都没有零
void restart_mat(matList *mats[]) {
int i, j, k;
if (mats == NULL) {
return;
}
for (k = 0; k < MAT_COUNT; k++) {
if (mats[k] != NULL) {
for (i = 0; i < MAT_SIZE; i++) {
for (j = 0; j < MAT_SIZE; j++) {
mats[k]->matrix[0][i][j] = 0;
}
}
}
}
}
回答1
2D arrays MAT_A, MAT_B, MAT_C, MAT_D, MAT_E, MAT_F
被定义为在调用 create_mat
的函数中自动存储的本地对象。在分配的 matList
结构中设置了指向这些 arrays 的指针。在函数返回后,这些 arrays 必须不再被引用。
除非有令人信服的理由分开分配 2D arrays 和 matList
结构,否则您应该将矩阵定义为 struct 成员而不是指针:
#include <stdio.h>
#include <stdlib.h>
typedef double mat[MAT_SIZE][MAT_SIZE];
typedef struct matList {
const char *name;
mat matrix;
} matList;
void init_mat(mat m) {
for (int i = 0; i < MAT_SIZE; i++) {
for (int j = 0; j < MAT_SIZE; j++) {
m[i][j] = 0;
}
}
}
matList *create_mat(const char *name) {
matList *tempMat = malloc(sizeof(*tempMat));
if (tempMat != NULL) {
tempMat->name = name;
init_mat(tempMat->matrix);
}
return tempMat;
}
// return non zero if successful
int allocate_matList(matList *mats) {
for (int i = 0; i < MAT_COUNT; i++) {
mats[i] = NULL;
}
mats[0] = create_mat("MAT_A");
mats[1] = create_mat("MAT_B");
mats[2] = create_mat("MAT_C");
mats[3] = create_mat("MAT_D");
mats[4] = create_mat("MAT_E");
mats[5] = create_mat("MAT_F");
return mats[0] && mats[1] && mats[2] &&
mats[3] && mats[4] && mats[5];
}
void restart_matList(matList *mats) {
if (mats != NULL) {
for (int k = 0; k < MAT_COUNT; k++) {
if (mats[k] != NULL)
init_mat(mats[k]->matrix);
}
}
}