malloc() Function in C library with EXAMPLE
โก Smart Summary
malloc() in C reserves a block of memory on the heap at runtime and returns a void pointer to its first byte, letting programs request storage whose size is unknown until the code actually executes.

What is malloc in C?
The malloc() function stands for memory allocation. It is a function which is used to allocate a block of memory dynamically. It reserves memory space of specified size and returns the null pointer pointing to the memory location. The pointer returned is usually of type void. It means that we can assign malloc function to any pointer.
Syntax
ptr = (cast_type *) malloc (byte_size);
Here,
- ptr is a pointer of cast_type.
- The malloc function returns a pointer to the allocated memory of byte_size.
Example: ptr = (int *) malloc (50)
When this statement is successfully executed, a memory space of 50 bytes is reserved. The address of the first byte of reserved space is assigned to the pointer ptr of type int.
Consider another example of malloc implementation:
#include <stdlib.h> int main(){ int *ptr; ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */ if (ptr != NULL) { *(ptr + 5) = 480; /* assign 480 to sixth integer */ printf("Value of the 6th integer is %d",*(ptr + 5)); } }
Output:
Value of the 6th integer is 480
Notice that sizeof(*ptr) was used instead of sizeof(int) in order to make the code more robust when *ptr declaration is typecasted to a different data type later.
The allocation may fail if the memory is not sufficient. In this case, it returns a NULL pointer. So, you should include code to check for a NULL pointer.
Keep in mind that the allocated memory is contiguous and it can be treated as an array. We can use pointer arithmetic to access the array elements rather than using brackets [ ]. We advise to use + to refer to array elements because using incrementation ++ or += changes the address stored by the pointer.
Malloc function can also be used with the character data type as well as complex data types such as structures.
Why Use malloc() in C?
Static arrays and ordinary variables fix their size when the program is compiled, which wastes space when the requirement turns out smaller and fails outright when it turns out larger. malloc() solves this by requesting memory at runtime, so a program can size a buffer to the exact amount of data it receives. This runtime flexibility is the heart of dynamic memory allocation in C.
Dynamic allocation with malloc() is the right choice in several common situations:
- The amount of input is unknown until the program runs, such as reading a file or a user-supplied list.
- Large blocks are needed that would overflow the limited stack, since malloc() draws from the much larger heap.
- Data must outlive the function that created it, because heap memory persists until it is explicitly released.
- Structures and arrays need to grow or shrink while the program is executing.
Because the reserved block is handed back as a pointer, it can be passed between functions cheaply without copying the underlying data.
How to Free Memory Allocated by malloc()
Memory reserved by malloc() lives on the heap and is never released automatically. When a program keeps allocating without freeing, it slowly consumes all available memory, a defect known as a memory leak. The free() function returns a finished block to the system so the space can be reused.
The free() function takes a single argument, the pointer that malloc() returned, and releases the whole block at once:
int *ptr; ptr = malloc(10 * sizeof(int)); if (ptr != NULL) { /* use the allocated memory here */ free(ptr); /* release the block */ ptr = NULL; /* avoid a dangling pointer */ }
Follow these rules to manage dynamic memory safely:
- Call free() exactly once for every successful malloc(); freeing the same block twice causes undefined behavior.
- Set the pointer to NULL after freeing so it cannot be reused as a dangling pointer.
- Never free() a pointer that malloc() did not return, including one shifted by pointer arithmetic.
- Match every allocation with a matching release before the pointer goes out of scope.
Keeping allocation and release in balance is the core discipline of manual memory management in C, and it prevents both leaks and crashes caused by reusing freed memory.
malloc() vs calloc(): Key Differences
malloc() and calloc() both reserve heap memory, but they differ in their arguments and in how they treat the new block. malloc() takes one argument, the total number of bytes, and leaves the contents uninitialized, so the block holds unpredictable garbage values until the program writes to it. calloc() takes two arguments, the number of elements and the size of each, and clears every byte to zero before returning the pointer.
The practical differences come down to three points:
- Initialization: calloc() zeroes the memory, while malloc() does not, which makes malloc() slightly faster when the values will be overwritten anyway.
- Arguments: you write malloc(n * size) but calloc(n, size) to reserve the same array.
- Use case: choose calloc() when a clean, zeroed block matters, and malloc() when speed is preferred and initialization is handled manually.
Both functions are declared in stdlib.h, both return a void pointer or NULL on failure, and both hand their memory back with the same free() function.

