arrays - 无法重新启动地址保存在 struct 中的 typedef 的二维数组

我有这个 typedefstruct

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);
        }
    }
}

相似文章

随机推荐

最新文章