Memory
Malloc Array
malloc can allocate enough heap storage for several elements.
element count
The requested byte count is the number of elements times the size of one element.
heap array
The returned pointer can be indexed like an array within the allocated range.
Malloc Array
malloc_array.c
Replay: real traced execution (multi-file project)
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int count = 3;
int *values = (int *)malloc((size_t)count * sizeof(int));
int sum = 0;
if (values == 0) {
return 1;
}
for (int i = 0; i < count; i++) {
values[i] = i + 1;
sum += values[i];
}
printf("sum=%d\n", sum);
free(values);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int count = 2;
int *values = (int *)malloc((size_t)count * sizeof(int));
int sum = 0;
if (values == 0) {
return 1;
}
for (int i = 0; i < count; i++) {
values[i] = i + 1;
sum += values[i];
}
printf("sum=%d\n", sum);
free(values);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int count = 4;
int *values = (int *)malloc((size_t)count * sizeof(int));
int sum = 0;
if (values == 0) {
return 1;
}
for (int i = 0; i < count; i++) {
values[i] = i + 1;
sum += values[i];
}
printf("sum=%d\n", sum);
free(values);
return 0;
}
count ← 3, values ← ⟨addr A⟩, sum ← 0
4int main(void) {5 int count→ 3 = 3; //@count=2, 46 int *values→ ⟨addr A⟩ = (int *)malloc((size_t)count3 * sizeof(int));7 int sum→ 0 = 0;values[i] ← 1, sum ← 1
pass 1 of 313for (int i0 = 0; i < count3; i++) {14 values[i]→ 1 = i0 + 1;15 sum→ 1 += values[i]1;16}All 3 passes — pass 1 is the card above pass ivalues[i]sum1 0 0 → 1 0 → 1 2 1 0 → 2 1 → 3 3 2 0 → 3 3 → 6 printf("sum=%d ", sum);
18 printf("sum=%d\n", sum6);19 free(values⟨addr A⟩);20 return 0;21}outputsum=6
count ← 2, values ← ⟨addr A⟩, sum ← 0
4int main(void) {5 int count→ 2 = 2;6 int *values→ ⟨addr A⟩ = (int *)malloc((size_t)count2 * sizeof(int));7 int sum→ 0 = 0;values[i] ← 1, sum ← 1
pass 1 of 213for (int i0 = 0; i < count2; i++) {14 values[i]→ 1 = i0 + 1;15 sum→ 1 += values[i]1;16}values[i] ← 2, sum ← 3
pass 2 of 213for (int i1 = 0; i < count2; i++) {14 values[i]→ 2 = i1 + 1;15 sum→ 3 += values[i]2;16}printf("sum=%d ", sum);
18 printf("sum=%d\n", sum3);19 free(values⟨addr A⟩);20 return 0;21}outputsum=3
count ← 4, values ← ⟨addr A⟩, sum ← 0
4int main(void) {5 int count→ 4 = 4;6 int *values→ ⟨addr A⟩ = (int *)malloc((size_t)count4 * sizeof(int));7 int sum→ 0 = 0;values[i] ← 1, sum ← 1
pass 1 of 413for (int i0 = 0; i < count4; i++) {14 values[i]→ 1 = i0 + 1;15 sum→ 1 += values[i]1;16}All 4 passes — pass 1 is the card above pass ivalues[i]sum1 0 0 → 1 0 → 1 2 1 0 → 2 1 → 3 3 2 0 → 3 3 → 6 4 3 0 → 4 6 → 10 printf("sum=%d ", sum);
18 printf("sum=%d\n", sum10);19 free(values⟨addr A⟩);20 return 0;21}outputsum=10
Build the Heap Array
- Choose how many elements the array needs.
- Request
count * sizeof(int)bytes. - Check that
mallocreturned a real pointer. - Fill only indexes from
0throughcount - 1. - Release the array when the work is done.
items -> [0] [1] [2] [3]
valid indexes: 0 to count - 1
Exercise: malloc_array.c
Allocate space for five ints, check the malloc result, fill valid indexes, and free the array