C语言malloc,calloc,realloc,free内存分配函数学习笔记

内存分配

使用内存分配函数可以对内存进行分配、释放等操作。内存分配函数一般返回的是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_tstdlib.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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章