2. Dynamic Memory Allocation
Problem with Arrays
• Amount of data cannot be predicted beforehand
• Number of data items keeps changing during program execution
Solution:
• Find the maximum possible value of N and allocate an array of N elements
• Wasteful of memory space, as N may be much smaller in some executions
3. Dynamic Memory Allocation
Better Solution
•Dynamic memory allocation
• Know how much memory is needed after the program is run
• Example: ask the user to enter from keyboard
• Dynamically allocate only the amount of memory needed
4. Dynamic Memory Allocation
Memory Allocation Functions
• malloc
• Allocates requested number of bytes and returns a pointer to the first byte of
the allocated space
• calloc
• Allocates space for an array of elements, initializes them to zero and then
returns a pointer to the memory.
• free
• Frees previously allocated space.
• realloc
• Modifies the size of previously allocated space.
• We will only do malloc and free
5. Dynamic Memory Allocation
Allocating a Block of Memory
•A block of memory can be allocated using the function malloc
• Reserves a block of memory of specified size and returns a pointer of type
void
• The return pointer can be type-casted to any pointer type
•General format:
type *p;
p = (type *) malloc (byte_size);
6. Dynamic Memory Allocation
Example
p = (int *) malloc(100 * sizeof(int));
• A memory space equivalent to 100 times the size of an int bytes is reserved
• The address of the first byte of the allocated memory is assigned to the
pointer p of type int
p
400 bytes of space
7. Dynamic Memory Allocation
Example
• cptr = (char *) malloc (20);
Allocates 20 bytes of space for the pointer cptr of type char
• sptr = (struct stud *) malloc(10*sizeof(struct stud));
Allocates space for a structure array of 10 elements. sptr points to a structure
element of type struct stud
8. Dynamic Memory Allocation
• malloc always allocates a block of contiguous bytes
• The allocation can fail if sufficient contiguous memory space is not available
• If it fails, malloc returns NULL
if ((p = (int *) malloc(100 * sizeof(int))) == NULL)
{
printf (“n Memory cannot be allocated”);
exit();
}
9. Dynamic Memory Allocation
Allocating a Block of Memory
calloc() method
•“calloc” or “contiguous allocation” method in C is used to
dynamically allocate the specified number of blocks of memory of the
specified type.
Syntax :
ptr = (cast-type*)calloc(n, element-size);
Example:
ptr = (float*) calloc(25, sizeof(float));
10. Dynamic Memory Allocation
Allocating a Block of Memory
free() method
• “free” method in C is used to dynamically de-allocate the memory. The memory
allocated using functions malloc() and calloc() is not de-allocated on their own.
• It helps to reduce wastage of memory by freeing it.
Syntax of free()
free(ptr);
11. Dynamic Memory Allocation
Allocating a Block of Memory
realloc() method
• “realloc” or “re-allocation” method in C is used to dynamically change the memory
allocation of a previously allocated memory.
• If the memory previously allocated with the help of malloc or calloc is insufficient,
realloc can be used to dynamically re-allocate memory.
• re-allocation of memory maintains the already present value and new blocks will be
initialized with the default garbage value.
Syntax :
ptr = realloc(ptr, newSize);
12. Dynamic Memory Allocation
Allocating a Block of Memory
realloc() method Example:
int* ptr;
int n, i;
// Get the number of elements for the array
n = 5;
printf("Enter number of elements: %dn", n);
// Dynamically allocate memory using calloc()
ptr = (int*)calloc(n, sizeof(int));
// Get the new size for the array
n = 10;
printf("nnEnter the new size of the array: %dn", n);
// Dynamically re-allocate memory using realloc()
ptr = realloc(ptr, n * sizeof(int));
// Memory has been successfully allocated