C中二维数组动态分配时的分段错误

时间:2013-06-27 23:43:23

标签: c multidimensional-array malloc

我是C编程的新手(经过很长时间重新学习)。我正在尝试使用malloc动态地将内存分配给2D数组。我尝试过关注stackoverflow上的答案,例如thisthis。但我仍然遇到分段错误。

我的代码如下

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

void allocate2DArray(int **subset, int a, int b)
{
  subset = (int **)malloc( a * sizeof(int *));
  int i,j;

  for(i = 0 ; i < a ; i++)
    subset[i] = (int *) malloc( b * sizeof(int));

  for(i = 0 ; i < a ; i++)
     for(j = 0 ; j < b ; j++)
        subset[i][j] = 0;
}

int main()
{
  int **subset;
  int  a = 4, b = 4;
  allocate2DArray(subset, a, b);
  int i,j;
  for( i = 0 ; i < a  ; i++)
  { 
     for( j = 0 ; j < b ; j++)
     {
        printf("%d ", subset[i][j]);
     }
     printf("\n");
  }
} 

当我对线条进行注释以打印数组时,它不会给出任何错误,并且程序在没有分段错误的情况下执行。请帮我理解我哪里出错了。

4 个答案:

答案 0 :(得分:2)

All problems in computer science can be solved by another level of indirection

void allocate2DArray(int ***p, int a, int b)
{
    int **subset;
    *p = (int **) malloc(a * sizeof(int *));
    subset = *p;

// ...
allocate2DArray(&subset, a, b);

答案 1 :(得分:0)

您必须将int ***subset传递给分配函数。这是因为参数是按值传递的。

答案 2 :(得分:0)

你需要这个:

void allocate2DArray(int ***subset, int a, int b)

和此:

allocate2DArray(&subset, a, b);

答案 3 :(得分:0)

使用int **subset;它不会成为2D数组。它仍然是1D存储,只是指向指针。

2D数组意味着指针缓冲区的每个元素必须指向ctn建议的缓冲区。 他建议*** ptr和* ptr是malloced,它创建了第一维缓冲区。 现在当你再次调用allocate2DArray()子集时,会分配内存来创建第二个维度。这验证了我的上述语句 - 指针缓冲区的每个元素都必须指向缓冲区。

现在使用建议的代码 -

 *p = (int **) malloc(a * sizeof(int *));

创建了一个数组,其中每个元素都指向缓冲区“子集”,它们共同创建了一个真正的2D数组。