【问题标题】:Allocating memory for a matrix in C, why can't I access the matrix afterwards?在C中为矩阵分配内存,为什么之后我不能访问矩阵?
【发布时间】:2012-12-19 19:44:28
【问题描述】:

我使用malloc 为矩阵分配内存,但之后我对矩阵进行的任何访问以设置元素都会导致分段错误。

这就是我现在正在做的事情:

int **matrix = malloc(rows_number * columns_number * sizeof(int));

if (matrix) matrix[0][0] = 1;

为什么矩阵创建后无法访问? malloc 调用成功,所以我有足够的连续内存用于整个矩阵。

【问题讨论】:

  • malloc 是 C 语言中理解最少、质疑最多的部分 - 请在此处和其他地方搜索有关此主题以及有关此主题的所有其他可想象问题的大量答案。老实说,我不敢相信还有一个关于 malloc 的问题没有被问到 - 并且得到了回答:)
  • allocate matrix in C 的可能重复项
  • 查看这个问题的最佳答案:stackoverflow.com/questions/917783/…>
  • @BimmerM3,这个最佳答案是错误的。这不是 2D 数组,而是指向 2D 数组指针仿真的指针。 C原生支持二维数组,为什么不用呢?

标签: c memory-management matrix malloc


【解决方案1】:

这里的问题是你只分配了内存,但你已经将你的对象声明为一组指向指针的指针。双下标需要一个指向每一行的指针向量一个告诉编译器有多少列的类型。

所以一些选项是:

  • 用代码进行下标计算,也许使用宏
  • 做两个mallocs()并初始化一个行指针向量
  • malloc 一个特定类型的对象,以便编译器可以看到它

例如...

int (*matrix)[ROWS][COLS] = malloc(ROWS * COLS * sizeof(int));
...
(*matrix)[i][j]

以下声明也可以:

int (*matrix)[][COLS] = malloc(ROWS * COLS * sizeof(int));

【讨论】:

  • 抱歉回复晚了,我明白我做错了什么。我将此答案标记为已接受的答案,因为它似乎是最完整的。谢谢。
【解决方案2】:

int **matrixmatrix 声明为指向int 的指针。你想要一个指向int 数组的指针。这将是int (*matrix)[columns_number]。你可以很好地分配它:

int (*matrix)[columns_number] = malloc(rows_number * sizeof *matrix);

【讨论】:

  • 我明白了,谢谢你的回答,我将另一个标记为已接受,因为它看起来更完整,但我喜欢这种方式,因为对矩阵的访问更直观。
【解决方案3】:

您已为 int 指针 的动态数组分配内存,而不是 int 元素。你可以试试这样的:

int *matrix_storage = malloc(rows_number * columns_number * sizeof(int));
int **matrix = malloc(rows_number * sizeof(int*));
for( int i = 0; i < rows_number; ++i )
    matrix[i] = &matrix_storage[ i * columns_number ];

【讨论】:

    【解决方案4】:

    Malloc 返回一个 void 指针,因此您没有创建二维数组。尝试类似:

    int **matrix;
    matrix = malloc(rows_number * sizeof(int*));
    for (int i=0; i<rows_number; i++)
        matrix[i] = (int*)malloc(columns_number * sizeof(int));
    

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 2015-11-23
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      相关资源
      最近更新 更多