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.pingtaimeng.com/article/detail/3195/C语言