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 <[email protected]> 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 <[email protected]> wrote:
>> @sandeep sir: thnx... good 1 :)
>>
>>
>>
>>
>>
>> On Sat, Jul 2, 2011 at 11:32 PM, Sandeep Jain <[email protected]> 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 [email protected].
>> > To unsubscribe from this group, send email to
>> > [email protected].
>> > 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 [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> 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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/algogeeks?hl=en.