C 语言下的 malloc和 free 的最简单的例子

本文通过一个实例详细介绍了如何在C语言中使用malloc和free函数进行内存分配与释放。在Windows环境下,利用VS2015编译器,作者展示了如何为整型数组动态分配内存,检查分配是否成功,并在使用完毕后正确释放内存。此过程对于理解C语言的数据结构和内存管理至关重要。
  1. C 语言的 malloc 和 free 的原理自行上网查。
  2. 环境: Windows 下的 VS 2015
  3. 注: 此文纯属是为了学习 <data structure> 时笔记,因为自己好久没碰 C 语言了,为了捡回这两个函数的用法,花了些时间。

用一个代码附上注释来解释标题的内容:

#include <stdlib.h>       // malloc(), free()
#include <stdio.h>
#include <process.h>      // exit()

// 声明空间的大小为 3
#define SIZE 3

int main() {
	int *T;

	// 使用 malloc() 申请空间
	T = (int*)malloc(SIZE * sizeof(int));

    // 判断是否申请成功,若申请失败,则提示退出
	if (T == NULL) {
		puts("failed......\n");
		exit(1);
	}
	puts(" malloc success....");

	// 给申请的空间赋值
	for (int i = 0; i < SIZE; i++) {
		T[i] = i;
	}

	// 打印值
	for (int i = 0; i < SIZE; i++) {
		printf("%d   ", T[i]);
	}

	// 使用 free 释放空间
	free(T);

	return 0;
}

编译结果:
在这里插入图片描述

来源:哔哩哔哩 C 语言视频。

### C语言中 `malloc` `calloc` 的区别及用法 #### 函数原型 在C语言标准库 `<stdlib.h>` 中定义了这两个函数: - `void *malloc(size_t size)`[^1] - `void *calloc(size_t num, size_t size)`[^2] #### 返回值初始化 `malloc()` 只负责分配指定大小的内存空间并返回指向这块区域的指针,不会对所分配的内存做任何初始化操作;而 `calloc()` 不仅会分配所需数量乘以单个元素字节长度的空间,还会将其全部置零。 ```c // 使用 malloc 分配未初始化的数组 int *arr_malloc = (int *)malloc(10 * sizeof(int)); // 使用 calloc 分配已初始化为全零的数组 int *arr_calloc = (int *)calloc(10, sizeof(int)); ``` #### 错误处理 无论采用哪种方式来获取堆上的存储单元,在实际应用过程中都应当注意可能出现错误的情形——即当系统无法满足请求时将会返回 NULL 值。因此建议每次调用之后都要验证结果的有效性[^4]。 ```c if (!ptr) { fprintf(stderr, "Memory allocation failed\n"); exit(EXIT_FAILURE); } ``` #### 性能考量 理论上讲,由于 `calloc()` 内部可能先执行了一次 `malloc()` 来获得足够的连续地址区间然后再进行填充工作,所以在某些情况下它的效率可能会稍逊于直接使用前者完成相同任务的速度。不过这种差异通常很小,并不是选择哪一个的主要依据[^3]。 #### 示例代码对比 下面给出一段简单的例子展示两者之间最直观的不同之处: ```c #include <stdio.h> #include <stdlib.h> int main(void){ // Malloc example without initialization int* ptr_m = (int*)malloc(5 * sizeof(int)); if(ptr_m != NULL){ for(int i=0; i<5 ;++i) printf("%d ", *(ptr_m+i)); // Output may be garbage values free(ptr_m); } puts(""); // Calloc example with zero-initialization int* ptr_c = (int*)calloc(5 ,sizeof(int)); if(ptr_c!=NULL){ for(int j=0;j<5;++j) printf("%d ",*(ptr_c+j));// All elements are initialized to 0 free(ptr_c); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值