Practical C Programs
Rolling Log
A fixed-size log can keep the most recent events by overwriting the oldest slot.
ring index
The next write position wraps back to zero when it reaches the end of the array.
recent values
The array stores a compact history without growing memory.
Rolling Log
rolling_log.c
Replay: real traced execution (multi-file project)
#include <stdio.h>
int main(void) {
int extraEvent = 4;
int log[3] = {0, 0, 0};
int events[4] = {1, 2, 3, extraEvent};
int next = 0;
for (int i = 0; i < 4; i++) {
log[next] = events[i];
next = (next + 1) % 3;
}
printf("next=%d log=%d,%d,%d\n", next, log[0], log[1], log[2]);
return 0;
}
#include <stdio.h>
int main(void) {
int extraEvent = 2;
int log[3] = {0, 0, 0};
int events[4] = {1, 2, 3, extraEvent};
int next = 0;
for (int i = 0; i < 4; i++) {
log[next] = events[i];
next = (next + 1) % 3;
}
printf("next=%d log=%d,%d,%d\n", next, log[0], log[1], log[2]);
return 0;
}
#include <stdio.h>
int main(void) {
int extraEvent = 7;
int log[3] = {0, 0, 0};
int events[4] = {1, 2, 3, extraEvent};
int next = 0;
for (int i = 0; i < 4; i++) {
log[next] = events[i];
next = (next + 1) % 3;
}
printf("next=%d log=%d,%d,%d\n", next, log[0], log[1], log[2]);
return 0;
}
extraEvent ← 4, log ← ⟨addr A⟩, events ← ⟨addr B⟩, next ← 0
3int main(void) {4 int extraEvent→ 4 = 4; //@extraEvent=2, 75 int log→ ⟨addr A⟩[3] = {0, 0, 0};6 int events→ ⟨addr B⟩[4] = {1, 2, 3, extraEvent4};7 int next→ 0 = 0;log[next] ← 1, next ← 1
pass 1 of 49for (int i0 = 0; i < 4; i++) {10 log[next]→ 1 = events[i]1;11 next→ 1 = (next + 1) % 3;12}All 4 passes — pass 1 is the card above pass ievents[i]log[next]next1 0 1 0 → 1 0 → 1 2 1 2 0 → 2 1 → 2 3 2 3 0 → 3 2 → 0 4 3 4 1 → 4 0 → 1 printf("next=%d log=%d,%d,%d ", next, log[0], log[1], log[2]);
14 printf("next=%d log=%d,%d,%d\n", next1, log[0]4, log[1]2, log[2]3);15 return 0;16}outputnext=1 log=4,2,3
extraEvent ← 2, log ← ⟨addr A⟩, events ← ⟨addr B⟩, next ← 0
3int main(void) {4 int extraEvent→ 2 = 2;5 int log→ ⟨addr A⟩[3] = {0, 0, 0};6 int events→ ⟨addr B⟩[4] = {1, 2, 3, extraEvent2};7 int next→ 0 = 0;log[next] ← 1, next ← 1
pass 1 of 49for (int i0 = 0; i < 4; i++) {10 log[next]→ 1 = events[i]1;11 next→ 1 = (next + 1) % 3;12}All 4 passes — pass 1 is the card above pass ievents[i]log[next]next1 0 1 0 → 1 0 → 1 2 1 2 0 → 2 1 → 2 3 2 3 0 → 3 2 → 0 4 3 2 1 → 2 0 → 1 printf("next=%d log=%d,%d,%d ", next, log[0], log[1], log[2]);
14 printf("next=%d log=%d,%d,%d\n", next1, log[0]2, log[1]2, log[2]3);15 return 0;16}outputnext=1 log=2,2,3
extraEvent ← 7, log ← ⟨addr A⟩, events ← ⟨addr B⟩, next ← 0
3int main(void) {4 int extraEvent→ 7 = 7;5 int log→ ⟨addr A⟩[3] = {0, 0, 0};6 int events→ ⟨addr B⟩[4] = {1, 2, 3, extraEvent7};7 int next→ 0 = 0;log[next] ← 1, next ← 1
pass 1 of 49for (int i0 = 0; i < 4; i++) {10 log[next]→ 1 = events[i]1;11 next→ 1 = (next + 1) % 3;12}All 4 passes — pass 1 is the card above pass ievents[i]log[next]next1 0 1 0 → 1 0 → 1 2 1 2 0 → 2 1 → 2 3 2 3 0 → 3 2 → 0 4 3 7 1 → 7 0 → 1 printf("next=%d log=%d,%d,%d ", next, log[0], log[1], log[2]);
14 printf("next=%d log=%d,%d,%d\n", next1, log[0]7, log[1]2, log[2]3);15 return 0;16}outputnext=1 log=7,2,3