Manual Memory Allocation
Most modern programming languages allow the programmer to allocate dynamic memory from the Heap (as opposed to the Stack) during the execution of a program. Consider the C program in Example 3-1.
Example 3-1. Sample program that allocates memory
#include <stdlib.h> #include <string.h> void f(char *inner) { char temp[11]; strcpy (temp, "algorithms"); int i; for (i=0; i<11; i++) { inner[i] = temp[i]; } } int main (int argc, char **argv) { char *ar1 = malloc(132); char *ar2 = malloc(132); int i = 17, j; f (ar2); return 0; }
When the program executes, variables that are local to a function (such as argc
, and argv
for main
) are assigned to locations on the Execution Stack, which stores the progress of the program execution. Dynamically allocated memory (such as ar1
in main
) is instead stored on the Heap, a separate region of memory available for allocation. The address of the variable determines where the memory can be found. In the example, one possible assignment of variables (on a Linux i686) is shown in Table 3-5.
Table 3-5. Addresses for symbols and variables
f variables |
Addresses |
main variables |
Addresses |
Global symbols |
Addresses |
---|---|---|---|---|---|
f.inner |
3221222728 |
main.argc |
3221222796 |
&f |
4195576 |
f.temp |
3221222704 |
main.argv |
3221222784 |
&main |
4195648 |
f.i |
3221222700 |
main.ar1 |
3221222776 | ||
main.ar2 |
3221222768 | ||||
main.i |
3221222764 | ||||
main.j |
3221222760 | ||||
*main.ar1 |
5246992 | ||||
*main.ar2 |
5247136 |
Note how the address values are all near one another, ...
Get Algorithms in a Nutshell now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.