Hello guys,

It's been a while since I last time posted in this forum.
I have strange problem regarding matrix allocation. I was asked to write code that includes 2D array dynamic allocation. I write two version of matrix allocation.
Here is in my opinio relevant part of the code:

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

int main( void )
{
  
  int rows, cols;
  int i, j;
  /*int * mat1Blok;*/
  int ** mat1;

  
  printf("Enter number of rows: ");
  scanf("%d", &rows);
  printf("Enter number of columns: ");
  scanf("%d", &cols);
  
  /*memory allocation*/

   /* mat1Blok = malloc(rows * cols * sizeof(int));
	mat1 = malloc(rows * sizeof(int*));
	for (i = 0; i < rows; ++i)
	{
		mat1[i] = &mat1Blok[i * cols];
	}
	*/
	
  mat1 = malloc(cols * sizeof(int*));
  for(i = 0; i < cols; i++)
  {
		mat1[i] = malloc(rows * sizeof(int));
  }
	
	printf("\nEnter elements row by row:\n");
	
	for (i = 0; i < rows; i++)
	   for(j = 0; j < cols; j++)
	       scanf("%d",&mat1[i][j]);
    /*
    free (mat1);
    free (mat1Blok);
    */
    
    for (i = 0; i < cols; i++)
    {
        free (mat1[i]);
    }
    free (mat1);
    system("PAUSE");	
    return 0;
}

I have tested both versions with Dev-Cpp on Windows platform and sent to my friend who discovered that if he uses version which is commented, everything is OK, but if he the use version as in the above code he gets segmentation fault when entering elements. He tested it in Linux. I don't have linux installed and i ask you to test this code and check if it will fail on linux machine. I don't see a reason for such behaviour and simply can't figure out what is wrong. He sad he got segmentation fault with rows = 3 and cols = 2.
Can you please check it?
Thanks

Recommended Answers

All 4 Replies

> mat1 = malloc(cols * sizeof(int*));
You've got the rows and cols mixed up in a couple of places.

> mat1 = malloc(cols * sizeof(int*));
You've got the rows and cols mixed up in a couple of places.

Hmm, this is important part:

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

First I allocate array of pointerts to int. Every array member will point to new array of integers (columns). In every columns there are exactly "rows" elements.
Still don't understand, why this code works on windows machine and fails on linux.

You're mixing up the meaning of a row and a column. The following allocates using column major order (a[cols][rows]):

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

And this prints using row major order (a[rows][cols]):

for (i = 0; i < rows; i++)
  for(j = 0; j < cols; j++)
    scanf("%d",&mat1[i][j]);

Unless rows and cols have the same value, the two aren't interchangeable and you're accessing memory outside the bounds of the array you just allocated. Linux is giving you a segmentation fault.

Yes, I see now, what a stupid mistake.

Thanks Narue

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.