在C语言中,内存管理是程序员的责任之一。C语言提供了一些标准库函数来进行动态内存分配和释放。以下是一些常见的内存管理函数:

1. malloc 和 free:

  •  malloc(size_t size):动态分配指定字节数的内存。返回指向分配内存的指针。

  •  free(void *ptr):释放之前由 malloc 分配的内存。不会改变指针的值,但释放了指针指向的内存。

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 动态分配整型数组
    int *arr = (int *)malloc(5 * sizeof(int));

    if (arr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    // 使用分配的内存

    // 释放内存
    free(arr);

    return 0;
}

2. calloc 和 realloc:

  •  calloc(size_t num, size_t size):分配一片指定数量和大小的内存,并将每个字节初始化为零。返回指向分配内存的指针。

  •  realloc(void *ptr, size_t size):重新分配之前由 malloc 或 calloc 分配的内存。返回指向新分配内存的指针。

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 动态分配整型数组并初始化为零
    int *arr = (int *)calloc(5, sizeof(int));

    if (arr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    // 使用分配的内存

    // 重新分配内存
    int *newArr = (int *)realloc(arr, 10 * sizeof(int));

    if (newArr == NULL) {
        printf("内存重新分配失败\n");
        free(arr);  // 注意:如果realloc失败,原始内存仍然需要释放
        return 1;
    }

    // 使用重新分配的内存

    // 释放内存
    free(newArr);

    return 0;
}

3. 内存分配错误处理:

在动态内存分配时,应该检查内存分配是否成功。如果分配失败,返回的指针将为 NULL。
#include <stdio.h>
#include <stdlib.h>

int main() {
    // 动态分配整型数组
    int *arr = (int *)malloc(5 * sizeof(int));

    if (arr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    // 使用分配的内存

    // 释放内存
    free(arr);

    return 0;
}

在释放内存后,最好将指针设置为 NULL,以避免悬空指针(dangling pointers)。
free(arr);
arr = NULL;

正确的内存管理对于避免内存泄漏和程序的稳定性非常重要。同时,程序员应该避免使用已释放的内存,以防止访问悬空指针。




转载请注明出处:http://www.zyzy.cn/article/detail/3195/C语言