Advanced Pointers
Dynamic Buffer
A dynamically allocated buffer can be filled through pointer arithmetic.
heap buffer
`malloc` returns storage whose lifetime continues until `free`.
pointer cursor
A pointer can move across array elements while the original pointer is kept for cleanup.
Dynamic Buffer
dynamic_buffer.c
Replay: real traced execution (multi-file project)
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int count = 3;
int *items = (int *)malloc((size_t)count * sizeof(int));
int *cursor = items;
int sum = 0;
for (int i = 0; i < count; i++) {
*cursor = i + 1;
sum += *cursor;
cursor++;
}
free(items);
printf("sum=%d\n", sum);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int count = 2;
int *items = (int *)malloc((size_t)count * sizeof(int));
int *cursor = items;
int sum = 0;
for (int i = 0; i < count; i++) {
*cursor = i + 1;
sum += *cursor;
cursor++;
}
free(items);
printf("sum=%d\n", sum);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int count = 4;
int *items = (int *)malloc((size_t)count * sizeof(int));
int *cursor = items;
int sum = 0;
for (int i = 0; i < count; i++) {
*cursor = i + 1;
sum += *cursor;
cursor++;
}
free(items);
printf("sum=%d\n", sum);
return 0;
}
count ← 3, items ← ⟨addr A⟩, cursor ← ⟨addr A⟩, sum ← 0
4int main(void) {5 int count→ 3 = 3; //@count=2, 46 int *items→ ⟨addr A⟩ = (int *)malloc((size_t)count3 * sizeof(int));7 int *cursor→ ⟨addr A⟩ = items⟨addr A⟩;8 int sum→ 0 = 0;sum ← 1, cursor ← ⟨addr B⟩
pass 1 of 310for (int i0 = 0; i < count3; i++) {11 *cursor⟨addr A⟩ = i0 + 1;12 sum→ 1 += *cursor⟨addr A⟩;13 cursor→ ⟨addr B⟩++;14}All 3 passes — pass 1 is the card above pass isumcursor1 0 0 → 1 ⟨addr A⟩ → ⟨addr B⟩ 2 1 1 → 3 ⟨addr B⟩ → ⟨addr C⟩ 3 2 3 → 6 ⟨addr C⟩ → ⟨addr D⟩ free(items);
16 free(items⟨addr A⟩);17 printf("sum=%d\n", sum6);18 return 0;19}outputsum=6
count ← 2, items ← ⟨addr A⟩, cursor ← ⟨addr A⟩, sum ← 0
4int main(void) {5 int count→ 2 = 2;6 int *items→ ⟨addr A⟩ = (int *)malloc((size_t)count2 * sizeof(int));7 int *cursor→ ⟨addr A⟩ = items⟨addr A⟩;8 int sum→ 0 = 0;sum ← 1, cursor ← ⟨addr B⟩
pass 1 of 210for (int i0 = 0; i < count2; i++) {11 *cursor⟨addr A⟩ = i0 + 1;12 sum→ 1 += *cursor⟨addr A⟩;13 cursor→ ⟨addr B⟩++;14}sum ← 3, cursor ← ⟨addr C⟩
pass 2 of 210for (int i1 = 0; i < count2; i++) {11 *cursor⟨addr B⟩ = i1 + 1;12 sum→ 3 += *cursor⟨addr B⟩;13 cursor→ ⟨addr C⟩++;14}free(items);
16 free(items⟨addr A⟩);17 printf("sum=%d\n", sum3);18 return 0;19}outputsum=3
count ← 4, items ← ⟨addr A⟩, cursor ← ⟨addr A⟩, sum ← 0
4int main(void) {5 int count→ 4 = 4;6 int *items→ ⟨addr A⟩ = (int *)malloc((size_t)count4 * sizeof(int));7 int *cursor→ ⟨addr A⟩ = items⟨addr A⟩;8 int sum→ 0 = 0;sum ← 1, cursor ← ⟨addr B⟩
pass 1 of 410for (int i0 = 0; i < count4; i++) {11 *cursor⟨addr A⟩ = i0 + 1;12 sum→ 1 += *cursor⟨addr A⟩;13 cursor→ ⟨addr B⟩++;14}All 4 passes — pass 1 is the card above pass isumcursor1 0 0 → 1 ⟨addr A⟩ → ⟨addr B⟩ 2 1 1 → 3 ⟨addr B⟩ → ⟨addr C⟩ 3 2 3 → 6 ⟨addr C⟩ → ⟨addr D⟩ 4 3 6 → 10 ⟨addr D⟩ → ⟨addr E⟩ free(items);
16 free(items⟨addr A⟩);17 printf("sum=%d\n", sum10);18 return 0;19}outputsum=10