Dynamic memory lets a program get memory while it runs, not just before it starts. This helps when you don't know how much memory you need in advance.
Why dynamic memory is needed
ptr = malloc(size_in_bytes); // or ptr = calloc(number_of_elements, size_of_each); // and later free(ptr);
malloc reserves a block of memory but does not clear it.
calloc reserves and clears the memory to zero.
int *arr = malloc(5 * sizeof(int));
char *name = calloc(20, sizeof(char));
free(arr);
This program asks the user how many numbers they want to store. It then uses dynamic memory to create an array of that size, fills it with values, prints them, and frees the memory.
#include <stdio.h> #include <stdlib.h> int main() { int n; printf("Enter number of elements: "); scanf("%d", &n); int *arr = malloc(n * sizeof(int)); if (arr == NULL) { printf("Memory allocation failed\n"); return 1; } for (int i = 0; i < n; i++) { arr[i] = i * 10; } printf("Array elements:\n"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); free(arr); return 0; }
Always check if malloc or calloc returns NULL, which means memory allocation failed.
Remember to free any dynamic memory you allocate to avoid memory leaks.
Dynamic memory is slower than static memory but more flexible.
Dynamic memory lets programs use memory flexibly during runtime.
Use malloc or calloc to get memory, and free to release it.
This is useful when you don't know data size before the program runs.
Practice
Solution
Step 1: Understand static vs dynamic memory
Static memory is fixed at compile time, so it cannot change size during execution.Step 2: Identify the need for flexible memory
Dynamic memory allows programs to request memory as needed during runtime, useful when data size is unknown beforehand.Final Answer:
To allocate memory during program execution when size is unknown -> Option AQuick Check:
Dynamic memory = flexible size allocation [OK]
- Confusing dynamic memory with faster execution
- Thinking dynamic memory avoids pointers
- Believing dynamic memory stores only constants
Solution
Step 1: Recall malloc syntax
malloc requires the number of bytes to allocate, so multiply count by size of type.Step 2: Check each option
int *ptr = malloc(10 * sizeof(int)); correctly multiplies 10 by sizeof(int) and assigns to int pointer.Final Answer:
int *ptr = malloc(10 * sizeof(int)); -> Option BQuick Check:
malloc size = count * sizeof(type) [OK]
- Not multiplying by sizeof(int)
- Assigning malloc result to non-pointer
- Allocating too little memory
int *arr = malloc(3 * sizeof(int));
arr[0] = 5;
arr[1] = 10;
arr[2] = 15;
printf("%d", arr[1]);
free(arr);Solution
Step 1: Understand array assignment
arr[1] is assigned the value 10 in the code.Step 2: Check printf output
printf prints arr[1], so output is 10.Final Answer:
10 -> Option DQuick Check:
arr[1] = 10, so output = 10 [OK]
- Confusing index positions
- Forgetting to multiply by sizeof(int) in malloc
- Assuming free causes error here
int *ptr;
ptr = malloc(5);
ptr[0] = 1;
printf("%d", ptr[0]);
free(ptr);Solution
Step 1: Check malloc size argument
malloc(5) allocates 5 bytes, but int usually needs 4 bytes each, so 5 bytes is too small for 5 ints.Step 2: Correct malloc size
It should be malloc(5 * sizeof(int)) to allocate enough memory.Final Answer:
malloc size is too small, should be 5 * sizeof(int) -> Option CQuick Check:
malloc size = count * sizeof(type) [OK]
- Ignoring correct malloc size
- Thinking free must come before malloc
- Assuming ptr is uninitialized error
Solution
Step 1: Understand unknown input size
Since the number of integers is unknown, fixed arrays or single malloc calls are insufficient.Step 2: Use realloc for flexible resizing
Start with malloc, then use realloc to increase memory as more integers are entered.Final Answer:
Use malloc initially, then realloc to expand as needed -> Option AQuick Check:
Unknown size needs realloc for resizing [OK]
- Using fixed arrays for unknown input
- Not resizing memory dynamically
- Avoiding pointers for dynamic data
Ready to prove it?
Pass the test and this pattern moves unknown
