Skip to main content
Logo image

Section 21.1 malloc() - Dynamically Allocating Memory

Dynamic memory allocation happens at runtime: depending on your needs you can ask for memory, which is then reserved in the so-called heap (as opposed to the stack, where your ’normal’ variables are stored).
This can be useful, for example, when you need an array to store data but you don’t know until runtime how large this array needs to be.
Recall that memory in the stack is managed for you. The heap is a bit different. Unlike variables in the stack (which only persist for the duration of the function in which they are declared), memory allocated dynamically remains reserved for you until you explicitly free this reservation.
The C-command to ask for (allocate) memory in the heap is called malloc(). This function takes as an argument the amount of space you wish to reserve (in bytes), attempts to find that amount of space in the heap and then returns a pointer to the start of the reserved block of memory. The return data type of the malloc() function is a void * and it is your job to cast this void pointer to the type of pointer (int *, float *, etc.) that fits your needs.
The prototype for malloc() is thus
void * mallow(int numb_bytes);
The malloc() function can be found in the standard library <stdlib.h>. You therefore need to
#include <std lib.h>
in order to use the function. The following video demonstrates the use of malloc().

If you cannot see this codecast, please click here.

Check Your Understanding Check Your Understanding

1.

Suppose you wanted to reserve space in memory for one number of type float and then store the memory location in a variable numptr of type float *. Which of the following would be the correct way to do so?
  • numptr = (float *) malloc(sizeof(float));
    
  • Correct
  • numptr = malloc(float *);
    
  • Not quite. Try again!
  • numptr = (float) malloc(sizeof(float *));
    
  • Not quite. Try again!
  • (float *) numptr = malloc (float);
    
  • Not quite. Try again!
  • numptr = (float *) malloc(sizeof(num));
    
  • Not quite. Try again!