13. 指针与动态内存 - malloc calloc realloc free

印度小哥讲解的指针, 真的很好, 这里附上链接:
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 函数扩充内存的原理是:

  1. 若是原来分配的内存之后还有一堆空余的内存, 那就直接从原来的已经分配的内存之后进行扩充.
  2. 若是原来分配的内存之后没有空余的内存, 那就重新找一个自己重新分配大小的内存进行存储, 并将原来内存空间中存储的东西复制过去.

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值