【问题标题】:Segmentation Fault upon pointer dereferencing order指针取消引用顺序上的分段错误
【发布时间】:2016-05-31 09:51:41
【问题描述】:

我正在尝试读取矩阵,如下所示: 我已经在 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-&gt;data,我会得到SEGMENTATION FAULT。 但是,这里的代码似乎没有崩溃。但是A-&gt;data 返回NULL。我在这里错过了什么?

【问题讨论】:

  • ptr = (int **) malloc(A-&gt;m * A-&gt;n * sizeof(int)); ?为什么要分配 sizeof(type) 并期望将其用作 type**?避免这种情况的一种方法是ptr = malloc(A-&gt;m * A-&gt;n * sizeof(*ptr));,它会自动执行正确的操作。
  • 试试ptr = (int**) malloc(A-&gt;m * A-&gt;n * sizeof(int**));
  • @hagrawal:没有。只是没有。
  • @user2338150 你能指出你究竟在什么地方、什么时候出错。
  • ptr[i][j] : ptr[i] 未初始化(指向未分配的内存)。

标签: c pointers struct segmentation-fault dereference


【解决方案1】:

使用的分配只需要一个指针。

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

【讨论】:

  • 这段代码似乎有问题,输入m=3, n=1。它像这样崩溃:Heap block at 005E1508 modified at 005E151C past requested size of c。据我了解,运算符优先级可能不是导致此问题的原因。会是什么?
  • 感谢您的指出。我犯了同样的错误。这里的索引顺序是Column-Major。我错误地将其视为Row-Major。对于Row-Major', A->data[ i * A->n + j]`应该已经使用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多