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

count
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;
}
  1. 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;
  2. sum ← 1, cursor ← ⟨addr B⟩

    pass 1 of 3
    10for (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
    passisumcursor
    100 1⟨addr A⟩ ⟨addr B⟩
    211 3⟨addr B⟩ ⟨addr C⟩
    323 6⟨addr C⟩ ⟨addr D⟩
  3. free(items);

    16    free(items⟨addr A⟩);17    printf("sum=%d\n", sum6);18    return 0;19}
    outputsum=6
  1. 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;
  2. sum ← 1, cursor ← ⟨addr B⟩

    pass 1 of 2
    10for (int i0 = 0; i < count2; i++) {11    *cursor⟨addr A⟩ = i0 + 1;12    sum→ 1 += *cursor⟨addr A⟩;13    cursor→ ⟨addr B⟩++;14}
  3. sum ← 3, cursor ← ⟨addr C⟩

    pass 2 of 2
    10for (int i1 = 0; i < count2; i++) {11    *cursor⟨addr B⟩ = i1 + 1;12    sum→ 3 += *cursor⟨addr B⟩;13    cursor→ ⟨addr C⟩++;14}
  4. free(items);

    16    free(items⟨addr A⟩);17    printf("sum=%d\n", sum3);18    return 0;19}
    outputsum=3
  1. 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;
  2. sum ← 1, cursor ← ⟨addr B⟩

    pass 1 of 4
    10for (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
    passisumcursor
    100 1⟨addr A⟩ ⟨addr B⟩
    211 3⟨addr B⟩ ⟨addr C⟩
    323 6⟨addr C⟩ ⟨addr D⟩
    436 10⟨addr D⟩ ⟨addr E⟩
  3. free(items);

    16    free(items⟨addr A⟩);17    printf("sum=%d\n", sum10);18    return 0;19}
    outputsum=10