Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Not fully comprehending arrays and dynamic memory.

Reply
Thread Tools

Not fully comprehending arrays and dynamic memory.

 
 
Mark Healey
Guest
Posts: n/a
 
      04-13-2006
I'd like to allocate some memory for a two dimensional array.

The problem is that whenever I try to use pointer arithmetic I screw up.
I just want to use conventional array type statements to get at the memory.

Is there a way to do this?

--
Mark Healey
marknews(at)healeyonline(dot)com

 
Reply With Quote
 
 
 
 
Keith Thompson
Guest
Posts: n/a
 
      04-13-2006
Mark Healey <(E-Mail Removed)> writes:
> I'd like to allocate some memory for a two dimensional array.

[...]

<http://www.c-faq.com/aryptr/dynmuldimary.html>

--
Keith Thompson (The_Other_Keith) http://www.velocityreviews.com/forums/(E-Mail Removed) <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
 
Reply With Quote
 
 
 
 
Ben C
Guest
Posts: n/a
 
      04-13-2006
On 2006-04-13, Mark Healey <(E-Mail Removed)> wrote:
> I'd like to allocate some memory for a two dimensional array.
>
> The problem is that whenever I try to use pointer arithmetic I screw up.
> I just want to use conventional array type statements to get at the memory.
>
> Is there a way to do this?


It can be done, but it's a bit tricky, and even easier to screw up I
would say.

You can allocate one like this:

int (*d)[3][3] = malloc(sizeof *d);

And use it like this:

(*d)[2][1] = 100;

...

free(d);

etc.

It might be easier to use a typedef:

typedef int matrix_t[3][3];
matrix_t *m = malloc(sizeof *m);

...

(*m)[2][1] = 100;

...

free(m);

With this way of doing it both d and m are pointers to a single block of
memory, which only has to be freed once. Other solutions involve making
arrays of pointers (one pointer for each row), and potentially calling
malloc to allocate each row. It's important to be clear which you're
doing and to call free the right number of times.
 
Reply With Quote
 
Peter Shaggy Haywood
Guest
Posts: n/a
 
      04-16-2006
Groovy hepcat Ben C was jivin' on 13 Apr 2006 09:45:02 GMT in
comp.lang.c.
Re: Not fully comprehending arrays and dynamic memory.'s a cool scene!
Dig it!

>On 2006-04-13, Mark Healey <(E-Mail Removed)> wrote:
>> I'd like to allocate some memory for a two dimensional array.
>>
>> The problem is that whenever I try to use pointer arithmetic I screw up.
>> I just want to use conventional array type statements to get at the memory.
>>
>> Is there a way to do this?

>
>It can be done, but it's a bit tricky, and even easier to screw up I
>would say.
>
>You can allocate one like this:
>
> int (*d)[3][3] = malloc(sizeof *d);
>
>And use it like this:
>
> (*d)[2][1] = 100;


Or, even easier, like this:

#define ROWS 3
#define COLS 3
int (*d)[COLS] = malloc(ROWS * sizeof *d);
.... /* Checking for errors, etc. */
d[2][1] = 100;

Or, slightly trickier (because you have to handle multiple
allocations and deallocations), like so:

#define ROWS 3
#define COLS 3
int i;
int **d = malloc(ROWS * sizeof *d);
.... /* Checking for errors, etc. */
for(i = 0; i < ROWS; i++)
{
d[i] = malloc(COLS * sizeof *d[i]);
... /* Checking for errors, etc. */
}

d[2][1] = 100;

Or, even better still, simpler (because there are only two
allocations):

#define ROWS 3
#define COLS 3
int i;
int **d = malloc(ROWS * sizeof *d);
.... /* Checking for errors, etc. */
*d = malloc(ROWS * COLS * sizeof *d);
.... /* Checking for errors, etc. */
for(i = 1; i < ROWS; i++)
{
d[i] = d[i - 1] + COLS;
}

d[2][1] = 100;

--

Dig the even newer still, yet more improved, sig!

http://alphalink.com.au/~phaywood/
"Ain't I'm a dog?" - Ronny Self, Ain't I'm a Dog, written by G. Sherry & W. Walker.
I know it's not "technically correct" English; but since when was rock & roll "technically correct"?
 
Reply With Quote
 
Ben C
Guest
Posts: n/a
 
      04-16-2006
On 2006-04-16, Peter "Shaggy" Haywood <(E-Mail Removed)> wrote:
> Groovy hepcat Ben C was jivin' on 13 Apr 2006 09:45:02 GMT in
> comp.lang.c.
> Re: Not fully comprehending arrays and dynamic memory.'s a cool scene!
> Dig it!


>>On 2006-04-13, Mark Healey <(E-Mail Removed)> wrote:
>>> I'd like to allocate some memory for a two dimensional array.
>>>
>>> The problem is that whenever I try to use pointer arithmetic I screw up.
>>> I just want to use conventional array type statements to get at the memory.
>>>
>>> Is there a way to do this?

>>
>>It can be done, but it's a bit tricky, and even easier to screw up I
>>would say.
>>
>>You can allocate one like this:
>>
>> int (*d)[3][3] = malloc(sizeof *d);
>>
>>And use it like this:
>>
>> (*d)[2][1] = 100;


> Or, even easier, like this:
>
> #define ROWS 3
> #define COLS 3
> int (*d)[COLS] = malloc(ROWS * sizeof *d);
> ... /* Checking for errors, etc. */
> d[2][1] = 100;


This is certainly nicer, and makes sense because after all when you
allocate a one-dimensional array of N ints, you usually do it with:

int *p = malloc(N * sizeof *p);

not with:

int (*p)[N] = malloc(sizeof *p);

> Or, slightly trickier (because you have to handle multiple allocations
> and deallocations), like so: [...]


I would say it's better to avoid multiple allocations except when you
need them (when the rows are different lengths, say).
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
fully fast resizable arrays in c (c2) fir C Programming 21 03-20-2013 07:23 PM
Comprehending the standard,some confusion... amit.codename13@gmail.com C Programming 9 04-09-2009 08:09 PM
Comprehending the standard,some confusion... amit.codename13@gmail.com C Programming 0 04-08-2009 03:20 PM
Multidimensional arrays and arrays of arrays Philipp Java 21 01-20-2009 08:33 AM
Fully multiple, editable dynamic datagrid. Viren ASP .Net Datagrid Control 1 10-20-2003 06:53 PM



Advertisments