一、malloc函数原型
void *malloc(unsigned int num_bytes); //分配长度为num_bytes字节的内存块
函数说明:
- 包含在头文件stdlib.h中
- 函数作用是动态分配内存空间
- void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者其他数据类型),可以通过类型强制转化转化为其他任意类型指针
- num_bytes指的是分配的内存空间的大小,以字节(byte)计
- 分配成功则返回该内存的地址,失败则返回NULL
- 申请空间时会出现没有足够大的内存空间而申请失败,所以需要自行判断是否申请成功
使用实例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int num;
char* buffer;
scanf("%d",&num);
buffer = (char*)malloc(num+1);
if(buffer==NULL) exit(1);
for(int i=0; i<num+1; i++)
{
if(i!=num) buffer[i] = (char)(i+49);
else buffer[i] = '\0';
}
printf("%s",buffer);
return 0;
}
运行效果:
二、同样是动态分配空间的calloc函数
函数原型:
void* calloc(size_t num, size_t size);
函数说明:
- 此函数作用为申请num个size大小的连续内存空间,并将每一个字节初始化为0
- 申请内存成功时返回内存的地址,失败时返回NULL
- malloc函数申请完内存后,内部的数据是未知的垃圾数据
使用举例(以下两个例子实现同样的功能):
/*例子一*/
char *str1 = (char *)calloc(10, sizeof(char));
/*例子二*/
char *str2 = (char *)malloc(10);
memset(str2, 0, 10); //memset初始化函数,将str2后面的10个字节用0代替并返回str2
三、与malloc配套使用的free()函数
因为当使用malloc申请空间,当不再使用该空间时使用free函数释放,这才叫“动态内存分配”
使用举例:
int *p;
p = (int*)malloc(sizeof(int) * 128);
//分配128个整型存储单元,并将这128个连续的整型存储单元的首地址存储到指针变量p中
double *pd = (double*)malloc(sizeof(double) * 12);
//分配12个double型存储单元,并将首地址存储到指针变量pd中
free(p);
free(pd);
p = NULL;
pd = NULL; // 指针用完赋值NULL是个好习惯
总结:
- 使用malloc函数分配空间时记得判断是否申请空间成功,谨防内存泄漏
- 配套使用free函数释放不需要使用的内存空间
- 释放完毕之后最好给指针赋值为NULL
分享就到这里,感谢观看。
“写程序,不比其它的学科,动手才是硬道理。” ——绝影Hamber