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

count
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;
}
  1. 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;
  2. values[i] ← 1, sum ← 1

    pass 1 of 3
    13for (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
    passivalues[i]sum
    100 10 1
    210 21 3
    320 33 6
  3. printf("sum=%d ", sum);

    18    printf("sum=%d\n", sum6);19    free(values⟨addr A⟩);20    return 0;21}
    outputsum=6
  1. 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;
  2. values[i] ← 1, sum ← 1

    pass 1 of 2
    13for (int i0 = 0; i < count2; i++) {14    values[i]→ 1 = i0 + 1;15    sum→ 1 += values[i]1;16}
  3. values[i] ← 2, sum ← 3

    pass 2 of 2
    13for (int i1 = 0; i < count2; i++) {14    values[i]→ 2 = i1 + 1;15    sum→ 3 += values[i]2;16}
  4. printf("sum=%d ", sum);

    18    printf("sum=%d\n", sum3);19    free(values⟨addr A⟩);20    return 0;21}
    outputsum=3
  1. 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;
  2. values[i] ← 1, sum ← 1

    pass 1 of 4
    13for (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
    passivalues[i]sum
    100 10 1
    210 21 3
    320 33 6
    430 46 10
  3. 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

  1. Choose how many elements the array needs.
  2. Request count * sizeof(int) bytes.
  3. Check that malloc returned a real pointer.
  4. Fill only indexes from 0 through count - 1.
  5. 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