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.

Reply via email to