user2338150
user2338150

Reputation: 479

Segmentation Fault upon pointer dereferencing order

I'm trying to read a Matrix as here: I've tried it on Cygwin, and MinGW compilers.

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

If I set A->data before reading in values, I get a SEGMENTATION FAULT. However, the code here does not appear to crash. However A->data returns NULL. What am I missing here?

Upvotes: 0

Views: 105

Answers (1)

user3121023
user3121023

Reputation: 8286

A single pointer is all that is needed for the allocation being used.

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

Upvotes: 2

Related Questions