Dynamic memory allocation (heap) in Compiler Design - Time & Space Complexity
When a program requests memory during its run, it uses dynamic memory allocation on the heap. Understanding how the time to allocate or free memory grows helps us know how efficient this process is.
We want to find out how the time needed changes as the program asks for more or larger memory blocks.
Analyze the time complexity of the following heap allocation code snippet.
void* allocate(int size) {
Block* block = find_free_block(size); // search free list
if (block == NULL) {
block = request_from_os(size); // get new memory
}
mark_as_used(block);
return block->address;
}
This code tries to find a free memory block of the requested size on the heap. If none is found, it asks the operating system for more memory.
Look for repeated work that affects time.
- Primary operation: Searching the free list for a suitable block.
- How many times: This search may check many blocks, depending on the free list size.
As the program runs and requests more memory, the free list can grow longer, making the search take more time.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks in free list |
| 100 | About 100 checks |
| 1000 | About 1000 checks |
Pattern observation: The time to find a free block grows roughly in direct proportion to the number of free blocks.
Time Complexity: O(n)
This means the time to allocate memory grows linearly with the number of free blocks to check.
[X] Wrong: "Allocating memory always takes constant time because the OS handles it quickly."
[OK] Correct: The program often searches a list of free blocks first, which can take longer as more blocks exist, so allocation time depends on this search.
Understanding how dynamic memory allocation time grows helps you explain real-world program performance and shows you can think about resource management clearly.
"What if the free blocks were stored in a balanced tree instead of a list? How would the time complexity change?"
Practice
Solution
Step 1: Understand dynamic memory allocation
Dynamic memory allocation allows a program to request memory while it is running, not just before it starts.Step 2: Compare with static allocation
Static allocation reserves memory only at compile time or program start, unlike dynamic allocation which is flexible during execution.Final Answer:
To allocate memory during program execution as needed -> Option CQuick Check:
Dynamic allocation = allocate memory at runtime [OK]
- Confusing dynamic with static allocation
- Thinking memory is allocated only once at start
- Assuming dynamic allocation speeds up compilation
Solution
Step 1: Recall C dynamic memory syntax
In C,mallocis used with the size in bytes, e.g.,malloc(sizeof(int)).Step 2: Check each option
int *ptr = malloc(sizeof(int)); uses correct syntax with pointer andmalloc. Others use incorrect functions or syntax.Final Answer:
int *ptr = malloc(sizeof(int)); -> Option DQuick Check:
C malloc syntax = int *ptr = malloc(sizeof(type)) [OK]
- Using malloc without sizeof
- Assigning malloc result to non-pointer
- Using non-C functions like allocate or new
int *p = malloc(3 * sizeof(int));
p[0] = 10;
p[1] = 20;
p[2] = 30;
printf("%d", p[1]);What will be the output?
Solution
Step 1: Understand memory allocation and indexing
Memory for 3 integers is allocated. Values assigned are p[0]=10, p[1]=20, p[2]=30.Step 2: Identify printed value
The printf prints p[1], which is 20.Final Answer:
20 -> Option AQuick Check:
p[1] = 20 printed [OK]
- Confusing p[0] with p[1]
- Expecting runtime error without free()
- Misunderstanding pointer indexing
int *ptr; *ptr = 5; ptr = malloc(sizeof(int));
Solution
Step 1: Analyze pointer usage order
The code dereferencesptrbefore allocating memory withmalloc.Step 2: Understand consequences
Dereferencing an uninitialized pointer causes undefined behavior or crash.Final Answer:
Memory is allocated after dereferencing pointer -> Option AQuick Check:
Dereference before malloc = error [OK]
- Ignoring pointer initialization order
- Thinking malloc syntax is wrong
- Assuming no error without free()
Solution
Step 1: Understand problem requirements
The number of names is unknown, so fixed-size arrays may waste memory or be insufficient.Step 2: Choose dynamic allocation strategy
Allocating memory for each name as it is added allows flexible, efficient use of heap memory.Final Answer:
Use malloc to allocate memory for each name as it is added -> Option BQuick Check:
Unknown size = allocate dynamically per item [OK]
- Using fixed arrays wasting memory
- Declaring globals wastes flexibility
- Using static arrays limits size
Ready to prove it?
Pass the test and this pattern moves unknown
