C is basically a language in which you dimension your arrays at compile time - however, at run time you can call up
malloc or
calloc to grab a chunk of dynamic memory. This is very useful if you don't know how much space you'll need at compile time. We've several example in our
memory management module on our
C training courses.
But sometimes, you'll only gradually learn how much memory you need, even at run time. Take, for example, a simple example where you want to read a file into memory and then be able to go through it, many times, line by line. You won't know how many lines there are at the beginning ... so a single
malloc or
calloc won't do. But there are solutions.
First, you could use
realloc to extend the size of the memory block you have each time you add a new line.
Second, you could set up all your lines as linked lists, where each one contains a line of data and the address in memory of where the next line may be found.
The First option may lead to "thrashing" as memory is allocated and reallocated while the file is being read, with a large number of movements of the data between heap areas. And the second option may also be slow when you come to find data that's well down the list.
There is a
Third Way. You can use
realloc, but extend the size of the memory blocks in much more substantial chunks, and that's something that we did on today's course. The full source code may be found
here. The extra lines / critical lines are:
need = counter + 1;
if (have < need) {
info = realloc(info,(counter+16) * sizeof(char *));
have = counter+16;
}
Basically saying "if you haven't got enough space for another line, then grab space for 16 more ...
(written 2010-03-10)
Associated topics are indexed under
C050 - C and C based languages - C - General [3129] Extra courses - C and C++ - (2011-01-12)
[3053] Make - automating the commands for building and installing - (2010-11-16)
[2848] C course - final course example puts it all together - (2010-07-02)
[2763] Our C and C++ training course are on Open Source platforms - (2010-05-13)
[2536] All the Cs ... and Java too - (2009-12-13)
[2504] Learning to program in ... - (2009-11-15)
[2091] C, C++ and C# ... Java and JavaScript - (2009-03-20)
[2086] C Programming v Learning to Program in C. Which course? - (2009-03-17)
[2002] New C Examples - pointers, realloc, structs and more - (2009-01-20)
C212 - C and C based languages - Memory Management [3416] Storing Tcl source code encoded, and running via your own C program - (2011-09-02)
[3386] Adding the pieces together to make a complete language - C - (2011-08-11)
[3144] Setting up arrays in C - fixed size at compile time, or dynamic - (2011-01-24)
[3118] Arrays of arrays - or 2D arrays. How to program tables. - (2011-01-02)
[1845] Passing a table from Lua into C - (2008-10-18)
[1670] Dynamic Memory Allocation in C - (2008-06-09)
[1589] Dynamic Memory Allocation in C - calloc, realloc - (2008-03-22)
[1581] What is an lvalue? (Perl, C) - (2008-03-18)
[1497] Training Season Starts again! - (2008-01-07)
2f61
Some other Articles
Multiple Inheritance in C++ - a complete exampleDear Planners, please provide viable alternativesMelksham - Carnival, Party in the Park, and Spot the OddityPointers to Pointers to Pointers - what is the point?Efficient use of dynamic memory - C and reallocIs it worth it?Web page to telephone calls / links using an iPhoneRandom thoughts on Melksham Town Planning and developmentEarly Spring walk in MelkshamOliver Cromwell at Bristol Temple Meads