Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multidimensional array with unequal second dimension size using malloc()

I am playing around with multidimensional array of unequal second dimension size. Lets assume that I need the following data structure:

[&ptr0]->[0][1][2][3][4][5][6][7][8][9]

[&ptr1]->[0][1][2]

[&ptr2]->[0][1][2][3][4]

int main()
{
 int *a[3];
 int *b;
 int i;

 a[0] = (int *)malloc(10 * sizeof(int));
 a[1] = (int *)malloc(2 * sizeof(int));
 a[2] = (int *)malloc(4 * sizeof(int));

 for(i=0; i<10; i++) a[0][i]=i;

 for(i=0; i<2; i++) a[1][i]=i;

 for(i=0; i<4; i++) a[2][i]=i;
}

I did some tests and it seems like I can store a value at a[1][3]. Does it mean that rows in my array are of equal size 10?

like image 622
ashagi Avatar asked Feb 27 '23 10:02

ashagi


2 Answers

No, The address a[1][3] does not "officially exist". It is a memory which is not define in your program and accessing it result in a undefined behavior.

It can lead to the following error:

  • Segmentation fault (access a restricted memory)
  • Used a memory already used by other variable (other allocation memory) (so possible overwrite)
  • It can be an uninitialized value (unsused memory address)
like image 90
Phong Avatar answered Mar 02 '23 00:03

Phong


It is undefined behavior of your code. You are accessing something that you don't own. It may work, it may not, but it is always wrong.

like image 42
Khaled Alshaya Avatar answered Mar 01 '23 22:03

Khaled Alshaya