簡體   English   中英

指針取消引用順序時的分段錯誤

[英]Segmentation Fault upon pointer dereferencing order

我正在嘗試按以下方式讀取矩陣:我已經在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->dataSEGMENTATION FAULT 但是,這里的代碼似乎沒有崩潰。 但是A->data返回NULL 我在這里想念什么?

使用分配只需要一個指針。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM