// Una función reserva un bloque, y el bloque sobrevive a su marco.
#include <stdio.h>
#include <stdlib.h>

// Devuelve un bloque nuevo con first, first + 1, ... (n elementos), o NULL si no hay
// memoria. Quien llama es owner del bloque, y debe liberarlo con free.
int *range_new(int first, int n) {
    int *block = malloc(n * sizeof *block);
    if (block == NULL) {
        return NULL;
    }
    for (int i = 0; i < n; i++) {
        block[i] = first + i;
    }
    return block;
}

int main(void) {
    int *numbers = range_new(10, 4);
    if (numbers == NULL) {
        fprintf(stderr, "No hay memoria\n");
        return 1;
    }

    for (int i = 0; i < 4; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");

    free(numbers);
    return 0;
}
