Hi Gene, I was thinking the same thing which you implemented in your first snippet. But I tried it without using typedef. Following is my code:
#include <stdio.h> #include <malloc.h> int main() { int (*ptr)[4] ; ptr = (int ((*)[4]))malloc(2*sizeof(int (*)[4])); if (ptr) { int i,j,cnt =0; for (i= 0; i < 2;i++) for (j = 0; j < 4; j++) ptr[i][j] = cnt++; for (i= 0; i < 2;i++) for (j = 0; j < 4; j++) printf("%d\n",ptr[i][j]); /* Free will not work, as the above code * overwrites the signature used by free */ /* free((ptr)); */ } return 0; } This code is buggy, because as soon as the malloc returns, I try to write some data and in that process, I am overwriting the signature (which is used by free()), and hence free() call fails. Can you point out the problem? Thanks, Vishal On Sun, Jul 3, 2011 at 2:12 AM, Gene <gene.ress...@gmail.com> wrote: > Unfortunately this invokes undefined behavior, so it may not work for > all architectures and compilers. It relies on pointers to int having > the same alignment as int. > > By far the best way to do this is use C99 features: > > double (*a)[n_cols] = calloc(n_rows, sizeof *a); > > If you don't have C99 and the row length is fixed, then you can > allocated a 2d array very easily: > > #include <stdio.h> > #include <stdlib.h> > > #define ROW_SIZE 10 > typedef double ROW[ROW_SIZE]; > > int main(void) > { > int i, j n_rows = 15; > ROW *array = malloc(n_rows * sizeof(ROW)); > for (i = 0; i < n_rows; i++) > for (j = 0; j < ROW_SIZE; j++) > array[i][j] = 100 * i + j; > for (i = 0; i < n_rows; i++) { > for (j = 0; j < ROW_SIZE; j++) > printf("%5.0f", array[i][j]); > printf("\n"); > } > return 0; > } > > If you need both array axes to be variable, then the norm is to > allocate a 1d array and define a macro to allow 2d access: > > #include <stdio.h> > #include <stdlib.h> > > typedef double *ARRAY; > #define Elt(A, I, J, NCOLS) ((A)[(I) * (NCOLS) + (J)]) > > int no_fixed(void) > { > int i, j, n_rows = 15, n_cols = 10; > ARRAY array = malloc(n_rows * n_cols * sizeof array[0]); > for (i = 0; i < n_rows; i++) > for (j = 0; j < n_cols; j++) > Elt(array, i, j, n_cols) = 100 * i + j; > for (i = 0; i < n_rows; i++) { > for (j = 0; j < n_cols; j++) > printf("%5.0f", Elt(array, i, j, n_cols)); > printf("\n"); > } > return 0; > } > > > On Jul 2, 2:05 pm, vaibhav shukla <vaibhav200...@gmail.com> wrote: >> @sandeep sir: thnx... good 1 :) >> >> >> >> >> >> On Sat, Jul 2, 2011 at 11:32 PM, Sandeep Jain <sandeep6...@gmail.com> wrote: >> > Here's my solution. >> >> > int** allocateMatrix(int m, int n) >> > { >> > int **rowList = (int**)malloc(sizeof(int)*m*n + sizeof(int*)*m); >> > int *colList = (int*)(rowList+m); >> > int i; >> > for(i=0; i<m; i++) >> > { >> > rowList[i] = colList+i*n; >> > } >> > return rowList; >> > } >> >> > And here's the main method to test/understand the allocation. >> >> > int main() >> > { >> > int m=3, n=4; >> > int **mat = allocateMatrix(m,n); >> > int i, j, c=0; >> > int wordCount= m*n+m; //sizeof(int)*4*5 + sizeof(int*)*4; counting >> > words so sizeof is not needed >> > int* memMap = (int*)mat; >> >> > // Fill array elements with some values to be able to test >> > for(i=0; i<m; i++) >> > for(j=0; j<n; j++) >> > mat[i][j] = c++; >> >> > printf("\nAddress\t Value\n"); >> > for(i=0; i<wordCount; i++) >> > printf("\n%u\t==> %u", memMap+i, memMap[i]); >> >> > getchar(); >> > } >> >> > -- >> > You received this message because you are subscribed to the Google Groups >> > "Algorithm Geeks" group. >> > To post to this group, send email to algogeeks@googlegroups.com. >> > To unsubscribe from this group, send email to >> > algogeeks+unsubscr...@googlegroups.com. >> > For more options, visit this group at >> >http://groups.google.com/group/algogeeks?hl=en. >> >> -- >> best wishes!! >> Vaibhav Shukla- Hide quoted text - >> >> - Show quoted text - > > -- > You received this message because you are subscribed to the Google Groups > "Algorithm Geeks" group. > To post to this group, send email to algogeeks@googlegroups.com. > To unsubscribe from this group, send email to > algogeeks+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/algogeeks?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Algorithm Geeks" group. To post to this group, send email to algogeeks@googlegroups.com. To unsubscribe from this group, send email to algogeeks+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/algogeeks?hl=en.