// ===== CodeLab: C 内存管理:malloc 与 free =====
// 来源: https://aoerliang.dpdns.org/articles/c-memory
// 以下代码片段按文章出现顺序拼接, 共 5 段

// ----- 片段 1 (c) -----
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 5;
    int *arr = (int *)malloc(n * sizeof(int));
    if (arr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

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

    free(arr);       // 用完归还
    return 0;
}

// ----- 片段 2 (c) -----
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *arr = (int *)calloc(4, sizeof(int));  // 4 个元素,全为 0
    arr[0] = 10;
    arr[1] = 20;

    arr = (int *)realloc(arr, 8 * sizeof(int));  // 扩容到 8 个
    arr[7] = 99;

    for (int i = 0; i < 8; i++) {
        printf("%d ", arr[i]);   // 10 20 0 0 0 0 0 99
    }
    printf("\n");

    free(arr);
    return 0;
}

// ----- 片段 3 (c) -----
#include <stdlib.h>

void leak_example(void) {
    int *p = (int *)malloc(100 * sizeof(int));
    // 忘了 free(p) —— 每次调用泄漏 400 字节
    p = NULL;   // 指针丢了,内存再也找不回来
}

// ----- 片段 4 (c) -----
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *p = (int *)malloc(sizeof(int));
    *p = 42;
    printf("%d\n", *p);

    free(p);
    p = NULL;       // 关键:释放后立即置空
    // free(p);     // 即使再 free 一次,对 NULL 是安全的
    return 0;
}

// ----- 片段 5 (c) -----
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int cap = 2, size = 0;
    int *data = (int *)malloc(cap * sizeof(int));

    for (int i = 1; i <= 6; i++) {
        if (size == cap) {           // 空间不够就翻倍
            cap *= 2;
            data = (int *)realloc(data, cap * sizeof(int));
        }
        data[size++] = i * i;
    }

    for (int i = 0; i < size; i++) {
        printf("%d ", data[i]);
    }
    printf("\n容量 %d\n", cap);

    free(data);
    return 0;
}
