11.2 分配内存

这篇主要说一说C语言中几个分配内存的函数:malloc(),calloc()free()

内容在书12.4章.

C语言可以通过库函数分配和管理内存.下面的代码都为变量分配了一些内存.

float f;
char str[] = "This is a String";
int arr[100];

静态数据在程序载入内存时分配内存.自动数据程序执行代码块时分配,离开代码块时销毁.

同时,C语言还可以在程序运行时分配更多的内存.

1. malloc()

这个函数接收一个参数: 需要分配的字节数.

函数原型在stdlib.h中.

这个函数会找到合适的空闲内存块分配内存,这样的内存是匿名的,也就是通过malloc()函数分配的内存不会被赋名.不过通常要与下面介绍的free()函数一起使用.

返回值是动态分配的内存块的首字节地址.通常是指向char的指针.

ANSI C标准开始,出现了新的类型:指向void的指针,相当于通用指针.将void指针赋给任意类型的指针不需要考虑类型匹配的问题.malloc()的返回值也从char*变为void*.

下面的代码用malloc()函数创建了一个容量为10的double数组.

double* dp;
dp = (double*)malloc(10 * sizeof(double));

算上这种方式,现在有3种方法创建一个数组.

int arr[32];
声明时用常量表达式表示数组维度,用数组名访问数组的元素.可以用静态内存或动态内存创建这种数组.
int base = 10;
int arr[2 * base];
C99新特性:声明变成数组,用变量表达式表示数组的维度,用数组名访问数组的元素.只能在自动内存中创建.
int* pi;
pi = (int)malloc(32 * sizeof(int));
声明一个指针,并用malloc()分配内存,将返回值赋值给指针,可以是静态的也可以是自动的.
由于返回的是void*,所以通常需要强制类型转换.

2.free()

函数原型在stdlib.h中.

该函数的参数是malloc()函数返回的地址,以用来释放malloc()分配的内存.所以动态内存的存储期是从调用malloc()free()释放内存为止.

需注意,free()只能释放malloc()和后面提到的calloc()分配的内存.

free()应该位于程序的末尾,来释放malloc()分配的内存.

注意,有些系统会扎起程序结束时自动释放动态分配的内存,有些系统则不会.所以保险起见,无论什么时候都要使用free().

int* p;
p = (int)malloc(32 * sizeof(int));
...
free(p);

3.calloc()

这个函数与前面提到的malloc()类似,ANSI之前,返回char*,ANSI之后,返回void*.

用法也一样,首先定义一个指针,再分配内存.不过参数有所不同.

int* p;
p = (int)alloc(32,                 sizeof(int));
//              ↑所需的存储单元数量     ↑每个单元的大小

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值