user1999376
user1999376

Reputation: 1

Best way to expand dynamic memory in C

I'm looking for a way to allocate additional memory (in C) at runtime, for an existing structure (that already had its memory assigned initially). I have a feeling I might be able to use memmove or something similar but that's still just a copy operation, and doesn't increase the amount of memory available to a structure at runtime. Also I don't want to have to copy the entire structure every time I need to do this, which will be many hundreds of times during the program (the structure is already huge). Can anyone help?

UPDATE: Thanks everyone for the replies. To give more detail, what I am trying to do is run an MPI-parallelised code that creates many instances of the structure (call it 'S') initially. Each instance of the structure contains an array 'T' which records the time of a particular event happening as the code is run. These events occur at runtime, and the number of events differs for each instance of S. For example, S[0] might see 100 events (and therefore need an array of 100 elements in length) but S[1] might see only 1 event (and S[2] 30 events, etc.) Therefore it would be very wasteful to allocate huge amounts of memory at the start for every instance of S (for which there are millions) since some might fill the array but others would not even come close. Indeed I have tried this and it is too much for the machine I am running it on.

I will try some of the ideas here and post my progress. Many thanks!

Upvotes: 0

Views: 1527

Answers (4)

Lundin
Lundin

Reputation: 215090

It sounds like you are looking for the C feature called flexible array member (example). It is only well-defined for C standard C99 or later.

The last member of the struct will have to be declared as a flexible array member, which you initially malloc, and later realloc (and of course memcpy to do the actual copying).

Upvotes: 0

rashok
rashok

Reputation: 13484

realloc is the only way to expand the existing dynamic memory. realloc will tries to expand the existing buffer, if it fails in expansion it will allocate new buffer for the total size required and it will copy the data from old buffer. If you dont want to do realloc every time(which internally will memmove most of the time) then you can try to reallocate more memory than actually you required.

realloc(buf_ptr, (actual_size + additional_size) * 2);

This way will reduce the frequency of calling realloc (and memmove).

Note : Implementation of realloc is different in some architecture, it will never tries to expand the memory it always tries to allocate buffer for total size. So in those platforms memmove will be called for every call to realloc.

Upvotes: 0

Alexey Frunze
Alexey Frunze

Reputation: 62106

You could probably use realloc().

Upvotes: 5

Petar Ivanov
Petar Ivanov

Reputation: 93080

There is no way to do what you describe, because there is no way to guarantee that there will be available memory next to the one that your structure is currently occupying.

The standard thing to do is to allocate more memory and copy your data. Of course if you can know (an estimate of) the size of the memory allocation that you need you can preallocate it and avoid copying.

Note, however, that the structures in C have a fixed size once they are declared, so it seems you don't really need to allocate more memory for an existing structure...

Upvotes: 3

Related Questions