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.

Reply via email to