| | |
2D array allocation problem
Thread Solved |
•
•
Join Date: Aug 2005
Posts: 148
Reputation:
Solved Threads: 6
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:
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
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:
C Syntax (Toggle Plain Text)
#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
Last edited by Micko; Jun 6th, 2007 at 1:28 am.
•
•
Join Date: Aug 2005
Posts: 148
Reputation:
Solved Threads: 6
•
•
•
•
> mat1 = malloc(cols * sizeof(int*));
You've got the rows and cols mixed up in a couple of places.
C Syntax (Toggle Plain Text)
mat1 = malloc(cols * sizeof(int*)); for(i = 0; i < cols; i++) { mat1[i] = malloc(rows * sizeof(int)); }
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]):
And this prints using row major order (a[rows][cols]):
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.
C Syntax (Toggle Plain Text)
mat1 = malloc(cols * sizeof(int*)); for(i = 0; i < cols; i++) { mat1[i] = malloc(rows * sizeof(int)); }
C Syntax (Toggle Plain Text)
for (i = 0; i < rows; i++) for(j = 0; j < cols; j++) scanf("%d",&mat1[i][j]);
In case you were wondering, yes, I do hate you.
![]() |
Similar Threads
- array/funtion problem, please help (C++)
- Array Index Problem in Quick Sort (C#)
- Is there a simplest way to work this array problem? (C++)
- i have problem with array plz help (Java)
- Large Array Problem (PHP)
Other Threads in the C Forum
- Previous Thread: Product Of Even numbers [HELP]
- Next Thread: Is the
Views: 5795 | Replies: 4
| Thread Tools | Search this Thread |
Tag cloud for C
.net api array arrays binary binarysearch c++ char character code codeblocks coke command conversion convert curl database decimal directory dude dynamic engrish error exec factorial fgets file fork function functions getlasterror givemetehcodez grade graphics hardware homework i/o input insert int integer lazy libcurl line linked linkedlist linux list lists loop malloc matrix memory multi mysql no-effort output path pipe pointer pointers prime problem process program programming read recursion recursive recv recvblocked reverse scanf select server shape single socketprograming socketprogramming special spoonfeeding string strings strtok structures student subscript system systemcall tftp turbo-c turboc unbuffered unix user variable va_list voidmain() windows windows-mobile






