0

I am a newbie to C programming (relearning it after a long time) . I am trying to dynamically allocate memory to a 2D array using malloc. I have tried following the answers on stackoverflow like this and this. But I still get the segmentation fault.

My code is as below

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

When I comment the lines to print the array, it doens't give any error and program executes without segmentation fault. Please help me understand where I am going wrong.

4

4 回答 4

2

计算机科学中的所有问题都可以通过另一个层次的间接来解决

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

// ...
allocate2DArray(&subset, a, b);
于 2013-06-27T23:47:14.850 回答
0

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

于 2013-06-27T23:47:07.040 回答
0

你需要这个:

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

和这个:

allocate2DArray(&subset, a, b);
于 2013-06-27T23:48:09.823 回答
0

通过使用int **subset;它不会变成二维数组。它仍然是一维存储,只是指向指针的指针。

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

所以现在使用建议的代码 -

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

创建了一个数组,每个元素都指向缓冲区“子集”,这完全创建了一个真正的二维数组。

于 2013-06-28T06:26:21.780 回答