Bird
Raised Fist0
Embedded Cprogramming~5 mins

Memory pool (fixed-size block allocator) in Embedded C - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a memory pool (fixed-size block allocator)?
A memory pool is a way to manage memory by dividing a big chunk into many small fixed-size blocks. It helps quickly allocate and free memory without using the general heap.
Click to reveal answer
beginner
Why use fixed-size blocks in a memory pool?
Fixed-size blocks make allocation and deallocation very fast and simple because each block is the same size. This avoids fragmentation and complex bookkeeping.
Click to reveal answer
intermediate
How does a free list work in a memory pool?
A free list is a linked list of free blocks. When a block is freed, it is added back to the free list. When allocating, a block is taken from the free list.
Click to reveal answer
intermediate
What happens if the memory pool runs out of free blocks?
If no free blocks are left, allocation fails or returns NULL. The program must handle this case to avoid crashes or memory errors.
Click to reveal answer
intermediate
Show a simple C code snippet to initialize a memory pool with fixed-size blocks.
#define BLOCK_SIZE 32 #define BLOCK_COUNT 10 char pool[BLOCK_SIZE * BLOCK_COUNT]; void* free_list = NULL; void init_pool() { for (int i = 0; i < BLOCK_COUNT; i++) { void* block = &pool[i * BLOCK_SIZE]; *(void**)block = free_list; free_list = block; } }
Click to reveal answer
What is the main advantage of using a fixed-size block memory pool?
AAutomatically grows memory size
BSupports variable block sizes
CUses less memory than heap
DFast allocation and deallocation
In a memory pool, what data structure usually tracks free blocks?
AQueue
BBinary tree
CFree list (linked list)
DStack
What should a program do if the memory pool has no free blocks left?
AAllocate from heap automatically
BReturn NULL or error
COverwrite existing blocks
DIgnore and continue
Which of these is NOT a benefit of fixed-size block allocators?
AAllows variable block sizes
BSimplifies allocation logic
CAvoids fragmentation
DFast allocation speed
How is a block added back to the free list when freed?
ABy linking it to the head of the free list
BBy copying data to it
CBy resizing the block
DBy moving it to the end of the pool
Explain how a fixed-size block memory pool manages allocation and deallocation.
Think about how blocks are taken from and returned to the free list.
You got /4 concepts.
    Describe what happens when the memory pool runs out of free blocks and how a program should handle it.
    Consider what the allocator returns when no blocks are free.
    You got /4 concepts.

      Practice

      (1/5)
      1.

      What is the main advantage of using a memory pool with fixed-size blocks in embedded systems?

      easy
      A. Unlimited memory usage
      B. Automatic garbage collection
      C. Faster and predictable memory allocation
      D. Dynamic resizing of blocks

      Solution

      1. Step 1: Understand memory pool purpose

        A memory pool divides memory into fixed-size blocks to allocate memory quickly without fragmentation.
      2. Step 2: Identify advantage in embedded systems

        Embedded systems need fast and predictable memory allocation, which memory pools provide.
      3. Final Answer:

        Faster and predictable memory allocation -> Option C
      4. Quick Check:

        Memory pool advantage = Faster and predictable memory allocation [OK]
      Hint: Memory pools speed up allocation by fixed block sizes [OK]
      Common Mistakes:
      • Confusing memory pools with dynamic resizing
      • Thinking memory pools provide garbage collection
      • Assuming memory pools allow unlimited memory
      2.

      Which of the following is the correct way to declare a fixed-size memory pool array for 10 blocks of 32 bytes each in C?

      ?
      easy
      A. char pool[10][32];
      B. char pool[32][10];
      C. char *pool[10];
      D. char pool[10*32];

      Solution

      1. Step 1: Understand array dimensions

        We want 10 blocks, each block is 32 bytes, so array should be 10 rows and 32 columns.
      2. Step 2: Match declaration syntax

        char pool[10][32]; declares 10 blocks of 32 bytes each correctly.
      3. Final Answer:

        char pool[10][32]; -> Option A
      4. Quick Check:

        Array size = 10 blocks x 32 bytes [OK]
      Hint: Rows = blocks, columns = block size in bytes [OK]
      Common Mistakes:
      • Swapping dimensions (32 and 10)
      • Using pointer array instead of fixed blocks
      • Declaring a single large array without blocks
      3.

      Given this simplified memory pool allocator code snippet, what will be the output?

      char pool[3][16];
      int free_blocks = 3;
      
      char* allocate() {
          if (free_blocks > 0) {
              return pool[--free_blocks];
          }
          return NULL;
      }
      
      int main() {
          char* p1 = allocate();
          char* p2 = allocate();
          char* p3 = allocate();
          char* p4 = allocate();
          printf("%p %p %p %p\n", p1, p2, p3, p4);
          return 0;
      }
      medium
      A. Three valid pointers and one NULL pointer
      B. All pointers are NULL
      C. All pointers point to the same block
      D. Compilation error due to missing headers

      Solution

      1. Step 1: Trace allocation calls

        Initially free_blocks=3. Each allocate() call decrements free_blocks and returns pool[free_blocks]. So p1=pool[2], p2=pool[1], p3=pool[0], p4=NULL because free_blocks=0.
      2. Step 2: Understand output

        First three pointers are valid addresses, last pointer is NULL.
      3. Final Answer:

        Three valid pointers and one NULL pointer -> Option A
      4. Quick Check:

        3 blocks allocated, 4th returns NULL [OK]
      Hint: Allocation decreases free_blocks; NULL when none left [OK]
      Common Mistakes:
      • Assuming pointers are all NULL
      • Thinking pointers point to same block
      • Forgetting to decrement free_blocks
      4.

      Identify the bug in this memory pool free function and select the correct fix.

      void free_block(char* block) {
          if (free_blocks < MAX_BLOCKS) {
              pool[free_blocks++] = block;
          }
      }
      medium
      A. No bug; function works correctly
      B. Incrementing free_blocks before storing pointer causes overwrite
      C. Should check if block is NULL before freeing
      D. Store pointer in pool array is wrong; should mark block as free differently

      Solution

      1. Step 1: Analyze free_block logic

        The pool array holds actual memory blocks, not pointers. Storing a pointer in pool overwrites data.
      2. Step 2: Correct way to free block

        Freeing should mark the block as available in a separate structure or use a free list, not overwrite pool data.
      3. Final Answer:

        Store pointer in pool array is wrong; should mark block as free differently -> Option D
      4. Quick Check:

        Freeing must not overwrite pool memory [OK]
      Hint: Freeing must not overwrite pool data blocks [OK]
      Common Mistakes:
      • Overwriting pool memory with pointers
      • Not checking block validity
      • Assuming pool holds pointers, not blocks
      5.

      You want to implement a memory pool that supports 5 blocks of 64 bytes each. You also want to track which blocks are free using a bitmap (an integer where each bit represents a block's status: 0 = free, 1 = used). Which of the following code snippets correctly initializes the bitmap and allocates a block?

      ?
      hard
      A. int bitmap = 0xFF; // all used char pool[5][64]; char* allocate() { for (int i = 0; i < 5; i++) { if ((bitmap & (1 << i)) == 0) { bitmap &= ~(1 << i); return pool[i]; } } return NULL; }
      B. int bitmap = 0; // all free char pool[5][64]; char* allocate() { for (int i = 0; i < 5; i++) { if ((bitmap & (1 << i)) == 0) { bitmap |= (1 << i); return pool[i]; } } return NULL; }
      C. int bitmap = 0; // all used char pool[5][64]; char* allocate() { for (int i = 0; i < 5; i++) { if ((bitmap & (1 << i)) != 0) { bitmap |= (1 << i); return pool[i]; } } return NULL; }
      D. int bitmap = 0xFF; // all free char pool[5][64]; char* allocate() { for (int i = 0; i < 5; i++) { if ((bitmap & (1 << i)) != 0) { bitmap &= ~(1 << i); return pool[i]; } } return NULL; }

      Solution

      1. Step 1: Understand bitmap meaning

        Bitmap bit 0 means free, 1 means used. So initializing bitmap=0 means all blocks free.
      2. Step 2: Check allocation logic

        Allocation finds first free bit (0), sets it to 1 (used), and returns that block.
      3. Final Answer:

        Bitmap initialized to 0; allocate sets bit to 1 on allocation -> Option B
      4. Quick Check:

        0 = free, set bit to 1 when used [OK]
      Hint: 0 bits free, set bit to 1 when allocated [OK]
      Common Mistakes:
      • Initializing bitmap with all bits set (all used)
      • Checking wrong bit condition for free blocks
      • Setting bits incorrectly on allocation
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard