SIMON SON
SIMON SON

Reputation: 13

Using pointers and malloc alone, how to define 2D int array? mine seems doesnt work. (seg fault)

I want to declare 2D-array in .h file without given numbers of COLS nor ROWS (cause they are read somewhere from inside the main() )

I mean I could tried another way of doing this like below if one of ROWS and COLS is given at the firsthand.

int COLS = 20;
int (*array)[COLS];
array = malloc((*array) * ROWS); 

thus I tried like below:

below is 2d.h

int* a;
int** b;
int size; 

below is test2d.c, inside int main(){}

read_size() //size value read from some file
a = malloc(sizeof(int) * size);
b = malloc(sizeof(*a) * size);

for(int i=0; i<size; i++){  
  for(int j=0; j<size; j++){   
    b[i][j] = i+j;   
    printf("ok");  
  }
}

//print all

should be printing all 0112 but the result is segmentation fault.

Upvotes: 1

Views: 60

Answers (2)

Toby Speight
Toby Speight

Reputation: 30831

If you want a rectangular (not jagged array), it's most efficient to allocate all the cells as a single block, then the row pointers can all point into that block:

#include <stdlib.h>

int **make_array(size_t height, size_t width)
{
    /* assume this multiplication won't overflow size_t */
    int *cells = malloc((sizeof *cells) * height * width);
    int **rows = malloc((sizeof *rows) * height);
    if (!rows || !cells) {
        free(cells);
        free(rows);
        return 0;
    }
    /* now populate the array of pointers to rows */
    for (size_t row = 0;  row < height;  ++row) {
        rows[row] = cells + width * row;
    }
    return rows;
}

This also makes deallocation much simpler, as we no longer need a loop:

void free_array(int **a)
{
    if (!a) return;
    free(a[0]);
    free(a);
}

Upvotes: 0

Rishikesh Raje
Rishikesh Raje

Reputation: 8614

To allocate a 2D array you need to allocate the 2D pointer b, which you have done. After that you need to allocate memory for b[i] in a for loop as below

// cols and rows are input by user or other parts of program.
int **b;
b = malloc(sizeof(int*) * rows);

for(int i=0; i<rows; i++){  
    b[i] = malloc(sizeof(int) * cols);
}

The explanation for this is that b is an array of pointers to int. In each element of b you allocate an array of int. This gives you a 2D array.

Upvotes: 3

Related Questions