指针解除引用顺序时的分段错误

时间:2016-02-18 23:58:16

标签: c pointers struct segmentation-fault dereference

我正在尝试阅读Matrix,如下所示: 我在Cygwin和MinGW编译器上尝试过它。

#include <stdio.h>
#include <stdlib.h>

typedef struct _Matrix {
    int **data;
    int m;
    int n;
} Matrix;

Matrix *read_matrix(void) {
    Matrix *A;
    int i, j;
    int **ptr;

    A = (Matrix *) malloc(sizeof(Matrix));
    if(A == NULL) {
        return NULL;
    }

    printf("Enter m : ");
    scanf("%d", &A->m);
    printf("Enter n : ");
    scanf("%d", &A->n);

    ptr = (int **) malloc(A->m * A->n * sizeof(int));
    /*-- >> A->data = ptr; << --*/
    if(A->data == NULL) {
        return NULL;
    }
    printf("\n");
    for(i=0; i<A->m; ++i) {
        for(j=0; j<A->n; ++j) {
            printf("Enter element [%d][%d] : ", i, j);
            scanf("%d", &ptr[i][j]);
        }
    }
    A->data = ptr;
    return A;
}

int main() {
    Matrix *A;

    A = read_matrix();
    free(A->data); /* A-- A->data is NULL --*/
    free(A);
    return 0;
}

如果我在读取值之前设置A->data,我会得到SEGMENTATION FAULT。 但是,此处的代码似乎没有崩溃。但是A->data会返回NULL。我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

单个指针就是正在使用的分配所需的全部内容。

#include <stdio.h>
#include <stdlib.h>

typedef struct _Matrix {
    int *data;           //single pointer
    int m;
    int n;
} Matrix;

Matrix *read_matrix(void) {
    Matrix *A;
    int i, j;

    A = malloc(sizeof(Matrix));
    if(A == NULL) {
        return NULL;
    }

    printf("Enter m : ");
    scanf("%d", &A->m);
    printf("Enter n : ");
    scanf("%d", &A->n);

    A->data = malloc(A->m * A->n * sizeof(int));
    if(A->data == NULL) {
        return A;
    }
    printf("\n");
    for(i=0; i<A->m; ++i) {
        for(j=0; j<A->n; ++j) {
            printf("Enter element [%d][%d] : ", i, j);
            scanf("%d", &A->data[( j * A->m) + i]);
        }
    }
    return A;
}

int main() {
    Matrix *A;
    int i;
    int j;

    A = read_matrix();
    if ( A) {
        if ( A->data) {
            for(i=0; i<A->m; ++i) {
                for(j=0; j<A->n; ++j) {
                    printf("A[%d][%d]= %d\n", i, j, A->data[( j * A->m) + i]);
                }
            }
            free(A->data);
        }
        free(A);
    }
    return 0;
}