印度小哥讲解的指针, 真的很好, 这里附上链接:
https://www.bilibili.com/video/BV1bo4y1Z7xf/?spm_id_from=333.999.0.0
1. malloc
函数的使用方法
malloc
函数: void* malloc(size_t size);
malloc
会返回一个 void*
, 而且 malloc
函数中只能是“正整数”, 毕竟申请内存不可能申请一个“负的内存”.
使用 malloc
函数的时候默认的写法是:单元的数量 * 每个单元的字节数
.
因为 malloc
函数本身的返回值是:void*
, 但是 void*
本身也不能解引用, 所以对应的,
需要将其转换为:对应的类型, 比如 int*
. int* p = (int*)malloc(10 * sizeof(int))
;
2. calloc
函数
calloc
函数: void* calloc(size_t num, size_t size)
;
num
参数是特定元素的数量,
size
参数是类型的大小.
2.1 malloc
函数与 calloc
函数的区别
malloc
函数不会进行初始化, 若是没有给其分配值, 就会随便给你一个“垃圾值”.
calloc
函数会进行初始化, 若是没有给其分配值, 就会填入 0
.
3. realloc
函数
realloc
函数: void* realloc(void* memblock, size_t size)
;
realloc
函数扩充内存的原理是:
- 若是原来分配的内存之后还有一堆空余的内存, 那就直接从原来的已经分配的内存之后进行扩充.
- 若是原来分配的内存之后没有空余的内存, 那就重新找一个自己重新分配大小的内存进行存储, 并将原来内存空间中存储的东西复制过去.
realloc
函数缩容内存的原理有点复杂:直接看代码吧
int main() {
int n;
scanf("%d", &n);
int* arr = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
printf("\n");
int* arr1 = (int*)realloc(arr, (n / 2) * sizeof(int));
// 然而,realloc 的行为可能会导致一些意外的结果,特别是在减少内存大小的情况下。
// 具体来说,realloc 可能会将原始内存块的内容复制到新的内存块中,但只复制新大小范围内的内容。
// 如果新的内存块大小小于原始内存块大小,realloc 不会自动截断超出新大小的部分,而是保留这些数据。
printf("\n原来的内存空间:%p 后来的内存空间:%p\n", arr, arr1);
for (int i = 0; i < n; i++) {
printf("%d\n", arr1[i]);
}
return 0;
}
3.1 用 realloc
函数实现 malloc函数和free函数
使用“realloc函数”进行动态内存管理. (用“realloc函数”实现“malloc函数”).
int main() {
int n;
scanf("%d", &n);
int* arr = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
printf("\n");
int* arr1 = (int*)realloc(NULL, n * sizeof(int)); //用“realloc函数”实现“malloc函数”, 创建空间.
printf("\n原来的内存空间:%p 后来的内存空间:%p\n", arr, arr1);
for (int i = 0; i < n; i++) {
printf("%d\n", arr1[i]);
}
return 0;
}
使用“realloc函数”进行动态内存管理. (用“realloc函数”实现“free函数”).
int main() {
int n;
scanf("%d", &n);
int* arr = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
printf("\n");
int* arr1 = (int*)realloc(arr, 0); //用“realloc函数”实现“free函数”, 释放空间.
printf("\n原来的内存空间:%p 后来的内存空间:%p\n", arr, arr1);
for (int i = 0; i < n; i++) {
printf("%d\n", arr1[i]);
}
return 0;
}