如何使用2D数组和动态内存分配的结构

时间:2016-03-03 23:44:56

标签: c arrays struct 2d

我无法弄清楚如何获得与以下代码相同的结果,但是使用结构。

我的目标是使用结构创建一个动态分配的2D数组,初始化为全零,但我不确定我做错了什么。我自己尝试了很多东西,并且我在网上找到了它们,但它们似乎都不起作用。

printf("Enter the number of rows: ");
scanf("%d", &r);
printf("Enter the number of columns: ");
scanf("%d", &c);
int** list = (int**)malloc(r * sizeof(int*));
for (i = 0 ; i < r ; i++) {
        list[i] = (int*) malloc(c * sizeof(int));
        for ( x = 0 ; x < c ; x++) {
                list[i][x] = 0;
        }
}

我的结构代码如下:

typedef struct {
    int num_rows;
    int num_cols;
    int** data;
} BinaryMatrix;

BinaryMatrix* ConstructBinaryMatrix(int num_rows,int num_cols);


BinaryMatrix* ConstructBinaryMatrix(int num_rows, int num_cols) {
    if (num_rows <= 0 || num_cols <= 0) {
            printf("Error.\n");
            return EXIT_FAILURE;
    } else {
            int i,x;
            BinaryMatrix* A;
            A->num_rows = num_rows;
            A->num_cols = num_cols;

            A->data = (int**) malloc(A->num_rows * sizeof(int*));

            for (i = 0; i < num_rows; i++) {
                    (A->data)[i] = malloc(A->num_cols * sizeof(int*));
                    for (x = 0; x < A->num_cols; x++) {
                            (A->data)[i][x] = 0;
                    }
            }

            return A;
    }
}

BinaryMatrix* M;
printf("Enter the number of rows: ");
scanf("%d", &num_rows);
printf("Enter the number of cols: ");
scanf("%d", &num_cols);
M = ConstructBinaryMatrix(num_rows, num_cols);

我收到的错误是分段错误。而且似乎正好在第一次malloc调用完成的那一刻发生。

我正在学习C并需要一些指导。我来自Python,所以这对我来说都是新的。请帮忙,谢谢。

1 个答案:

答案 0 :(得分:0)

BinaryMatrix* A;
A->num_rows = num_rows;

这是你的问题;您正在取消引用非malloc指针。您需要先malloc一个BinaryMatrix并将其分配给A才能取消引用其字段。

BinaryMatrix* A = malloc(sizeof(BinaryMatrix));