Definition
The malloc function dynamically allocates a contiguous block of uninitialized memory on the heap. It is the primary mechanism for runtime memory allocation in C, enabling flexible data structures, variable-sized buffers, and long-lived objects that outlive function scope.
Syntax & Parameters
#include <stdlib.h> void *malloc(size_t size);
| Parameter | Type | Description |
|---|---|---|
size | size_t | Number of bytes to allocate. Must be greater than zero for predictable behavior |
Return Value & Behavior
- Returns a
void *pointer to the first byte of the allocated block - Returns
NULLif allocation fails due to insufficient memory, fragmentation, or exceeding system limits - Memory is uninitialized and contains indeterminate values
- Guaranteed alignment suitable for any standard data type (typically 8 or 16 bytes)
- Block remains allocated until explicitly freed via
free()or program termination
Code Examples
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(void) {
// Single object allocation
int *num = malloc(sizeof(int));
if (num == NULL) {
perror("Allocation failed");
return EXIT_FAILURE;
}
*num = 42;
// Dynamic array allocation
size_t count = 10;
double *array = malloc(count * sizeof(double));
if (array == NULL) {
free(num); // Prevent leak before exit
return EXIT_FAILURE;
}
// Use and clean up
array[0] = 3.14;
printf("%d %.2f\n", *num, array[0]);
free(array);
free(num);
return EXIT_SUCCESS;
}
Rules & Constraints
- Zero Size Behavior:
malloc(0)is implementation-defined. May returnNULLor a unique non-NULL pointer that must still be passed tofree(). Never dereference. - Alignment Guarantee: Returned pointer is aligned to suit any fundamental type. Suitable for
int,double,struct, etc. - No Initialization: Contents are undefined. Use
calloc()ormemset()if zeroed or pattern-initialized memory is required. - Heap Limits: Constrained by virtual address space, OS per-process limits, and heap fragmentation. Not bound by stack size.
- Thread Safety: Standard implementations are thread-safe. Concurrent calls from multiple threads are safe without external locking.
- Ownership Transfer: Caller assumes full responsibility for tracking, resizing, and freeing the allocated memory.
Best Practices
- Always check for
NULLbefore dereferencing or using the pointer - Use
sizeof(type) * countpattern to calculate sizes safely - Prefer
calloc()when zero-initialized memory is needed - Free in reverse order for complex nested structures to maintain logical cleanup flow
- Set pointers to
NULLafterfree()to prevent accidental reuse - Use temporary variables with
realloc()to avoid losing the original pointer on failure - Avoid casting the return value in C: implicit conversion from
void *is standard and masks missing#include <stdlib.h>warnings
Common Pitfalls
- 🔴 Missing NULL check → segmentation fault on allocation failure
- 🔴 Size calculation overflow →
count * sizeof(type)wraps around, allocates tiny block → buffer overflow - 🔴 Forgetting to free → memory leaks, gradual resource exhaustion
- 🔴 Double free → heap corruption, crashes, security vulnerabilities
- 🔴 Use-after-free → accessing freed memory yields undefined behavior
- 🔴 Assuming zero initialization → reading uninitialized values produces garbage
- 🔴 Casting return value →
int *p = (int *)malloc(...)suppresses useful compiler diagnostics - 🔴 Losing original pointer on
reallocfailure →ptr = realloc(ptr, new);overwritesptrwithNULLif it fails
Standards & Tooling
- C Standard: Defined in C89 through C23.
void *return type standardized in C89. Behavior unchanged across modern standards. - Implementation Variants: glibc ptmalloc, jemalloc, tcmalloc, Windows HeapAlloc. All conform to ISO C interface but differ in performance, fragmentation handling, and threading models.
- Compiler Diagnostics:
-Wall -Wextracatches missing includes.-fsanitize=addressdetects leaks, overflows, and use-after-free at runtime. - Static Analysis:
clang-tidy,cppcheck, andCoverityflag missing frees, double frees, and unsafe size calculations. - Memory Debuggers: Valgrind (
--leak-check=full), ASan, and Dr. Memory precisely track allocations, report leaks, and identify invalid accesses. - Modern Alternatives:
aligned_alloc()(C11) for custom alignment, custom arena allocators for performance-critical paths, and region-based memory management for batched cleanup.
C Preprocessor, Macros & Compilation Directives (Complete Guide)
https://macronepal.com/aws/mastering-c-variadic-macros-for-flexible-debugging/
Explains variadic macros in C, allowing functions/macros to accept a variable number of arguments for flexible logging and debugging.
https://macronepal.com/aws/mastering-the-stdc-macro-in-c/
Explains the __STDC__ macro, which indicates compliance with the C standard and helps ensure portability across compilers.
https://macronepal.com/aws/c-time-macro-mechanics-and-usage/
Explains the __TIME__ macro, which provides the compilation time of a program and is often used for logging and debugging.
https://macronepal.com/aws/understanding-the-c-date-macro/
Explains the __DATE__ macro, which inserts the compilation date into programs for tracking builds.
https://macronepal.com/aws/c-file-type/
Explains the __FILE__ macro, which represents the current file name during compilation and is useful for debugging.
https://macronepal.com/aws/mastering-c-line-macro-for-debugging-and-diagnostics/
Explains the __LINE__ macro, which provides the current line number in source code, helping in error tracing and diagnostics.
https://macronepal.com/aws/mastering-predefined-macros-in-c/
Explains all predefined macros in C, including their usage in debugging, portability, and compile-time information.
https://macronepal.com/aws/c-error-directive-mechanics-and-usage/
Explains the #error directive in C, used to generate compile-time errors intentionally for validation and debugging.
https://macronepal.com/aws/understanding-the-c-pragma-directive/
Explains the #pragma directive, which provides compiler-specific instructions for optimization and behavior control.
https://macronepal.com/aws/c-include-directive/
Explains the #include directive in C, used to include header files and enable code reuse and modular programming.
HTML Online Compiler
https://macronepal.com/free-html-online-code-compiler/
Python Online Compiler
https://macronepal.com/free-online-python-code-compiler/
Java Online Compiler
https://macronepal.com/free-online-java-code-compiler/
C Online Compiler
https://macronepal.com/free-online-c-code-compiler/
C Online Compiler (Version 2)
https://macronepal.com/free-online-c-code-compiler-2/
Node.js Online Compiler
https://macronepal.com/free-online-node-js-code-compiler/
JavaScript Online Compiler
https://macronepal.com/free-online-javascript-code-compiler/
Groovy Online Compiler
https://macronepal.com/free-online-groovy-code-compiler/
J Shell Online Compiler
https://macronepal.com/free-online-j-shell-code-compiler/
Haskell Online Compiler
https://macronepal.com/free-online-haskell-code-compiler/
Tcl Online Compiler
https://macronepal.com/free-online-tcl-code-compiler/
Lua Online Compiler
https://macronepal.com/free-online-lua-code-compiler/