内存分配
使用内存分配函数可以对内存进行分配、释放等操作。内存分配函数一般返回的是void类型的指针,传统上曾使用返回char类型的指针,因为char类型只占据1字节。而最新ANSI规定返回void类型指针,这样可以指向任何类型,通常使用强制转化运算符进行返回值的强制转化,其实不使用也可以,因为存在隐式转换。
一、malloc()
1、原型:void *malloc(size_t size)
2、头文件:stdlib.h
3、功能:在内存中分配一块大小为size字节的内存区域
4、返回值:返回指向第一字节的地址,由于内存不足而分配失败,将返回NULL指针
5、参数解读:
i. 函数参数通常使用sizeof关键字来指定空间大小,以保证可移植性。
ii. size_t在stdlib.h中被定义为unsigned int型
6、补充:
i. 全称是memory allocation,中文叫动态内存分配。
7、举例:
例1:
#include <stdlib.h>
#include <stdio.h>
int main()
{
<span style="white-space:pre"> </span>int num,i;
<span style="white-space:pre"> </span>int *p;
<span style="white-space:pre"> </span>puts("需要输入多少个整形数据");
<span style="white-space:pre"> </span>scanf("%d",&num);
<span style="white-space:pre"> </span>p=(int *)malloc(num*sizeof(int));
<span style="white-space:pre"> </span>if(p==NULL)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>puts("分配内存失败!");
<span style="white-space:pre"> </span>exit(EXIT_FAILURE);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>printf("我们已经为你分配了%d个整型数据存储空间\n",num);
<span style="white-space:pre"> </span>puts("请输入数据:");
<span style="white-space:pre"> </span>for(i=0;i<num;i++)
<span style="white-space:pre"> </span>scanf("%d",p+i);
<span style="white-space:pre"> </span>puts("数据如下:");
<span style="white-space:pre"> </span>for(i=0;i<num;i++)
<span style="white-space:pre"> </span>printf("%d",*(p+i));
<span style="white-space:pre"> </span>free(p);
<span style="white-space:pre"> </span>return 0;
}
二、free()
1、原型:void free(*ptr)
2、头文件:stdlib.h
3、功能:释放被分配的内存
4、返回值:void
5、参数解读:参数为指向被分配过内存的指针,释放后指针成为“野指针”
6、补充:在确定不再使用被分配的内存区域后一定要释放内存,否则将造成占据的内存越来越来大,尤其是在递归函数时,最终造成内存溢出。程序关闭后,操作系统将自动释放内存。
7、例子:见例1
三、calloc()
1、原型:void *calloc(size_t count,size_t size)
2、头文件:stdlib.h
3、功能:分配内存
4、返回值:通用指针类型,如果不成功将返回NULL
5、参数解读:第一个参数指定size大小的个数,第二个为分配内存的大小
6、补充:此函数与malloc区别是,它初始化所有空间为0,这会降低效率,因为有些 时候我们并不需要这样的初始化
7、例子:
例2:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *str;
int n;
puts("请输入需要的内存空间大小");
scanf("%d",&n);
getchar();
str=(char *)calloc(n,sizeof(char));
puts("请输入字符串");
gets(str);
puts("你输入的字符串是:");
puts(str);
free(str);
return 0;
}
四、realloc()
1、原型:void *realloc(void *p,size_t size)
2、头文件:stdlib.h
3、功能:重新分配内存大小
4、返回值:指向新内存区域指针,失败为NULL
5、参数解读:第一个参数为原指针,第二个参数为重新分配大小的字节值
6、补充:
i. 该函数首先会判断size大小与原区域大小,如果新分配的内存区域比旧内存区域小,则会丢弃超出的内存部分。之后如果在原区域后无法再分配,则会另外寻找一块足够大的内存区域,并将原区域的内容复制到新内存中。
ii. 如果第一个参数为NULL,效果同malloc,如果第二个参数为0,效果同free