malloc
- 原型:
void *malloc(size_t size)
- size:请求内存的总字节数
- 返回值:
内存地址
NULL
#include<stdio.h>
#include<stdlib.h>
#define LEN 3
int main(void)
{
//定义指向堆空间指针
int* p = (int*)malloc(LEN*sizeof(int));
if(NULL==p)
{
printf("内存申请失败\n");
return -1;
}
//类数组方式赋值
for(int i=0;i<LEN;i++)
{
printf("输入:");
scanf("%d",p+i);
}
//遍历
for(int i=0;i<LEN;i++)
{
printf("%d\t",*(p+i));
}
//换行
printf("\n");
//释放内存
if(NULL!=p)
{
free(p);
p = NULL;
}
return 0;
}
总结
malloc
申请的内存在申请已后如同数组一样暂时性
不可变,同时申请的内存是连续内存
所以可以如同
数组一样通过下标
访问到元素
,同时用malloc
申请的内存空间系统不会进行初始化操作,内部处于随机状态
calloc
- 原型:
void *calloc(size_t nitems, size_t size)
- nitems:个数
- size:类型字节
- 返回值:
内存地址
NULL
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
printf("需要多个个?:");
int n;//个数
scanf("%d",&n);//用户输入个数
int* p = (int*)calloc(n,sizeof(int));//申请对应个数的内存
if(NULL==p)//申请失败的问题
{
printf("内存申请失败\n");
return -1;
}
for(int i=0;i<n;i++)//循环输入
{
printf("输入:");
scanf("%d",p+i);//类似数组
}
for(int i=0;i<n;i++)//循环输出
{
printf("%d\t",*(p+i));
}
printf("\n");
if(NULL!=p)//释放空间
{
free(p);
p=NULL;
}
return 0;
}
总结
calloc
具有申请空间后自动初始化的能力,官方描述中也是如此,malloc
是申请空间后不初始化,而传参数方面,两者几乎一样,malloc
的参数
是总字节
数,而calloc
则分开成个数
与单个字节
数- 在元素访问上看与数组无异
realloc
- 原型:
void *realloc(void *ptr, size_t size)
- ptr:需要重新分配内存空间的目标地址
- size:重新分配后的总大小
- 返回值:
内存地址
NULL
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
char* str=(char*)calloc(8,sizeof(char));//申请堆区内存
strcpy(str,"abcdefg");
printf("重新分配之前第四位字符:%c\n",*(str+3));
printf("重新分配之前:%d个占位\n",(int)strlen(str));
str = (char*)realloc(str,((int)sizeof(str)+2)*sizeof(char));
printf("重新分配之后:%d个占位\n",(int)strlen(str));
if(NULL!=str)
{
free(str);
str = NULL;
}
return 0;
}
总结
realloc
只能重新分配从malloc
calloc
申请到的内存空间,如果分配其它空间绝逼报错不解释,最易出错的在于malloc
是直接申请一块内存,只需要传入你的需求量,并且不会帮你初始化,而calloc
同样是直接申请一块内存但会初始化,传值是个数和单个类型的字节,而realloc
是起到一个重新分配的作用,它的参数需要的是一个目标指针,和分配后这个目标指针的总大小,就好比原先的内存占用是2个字节的,现在需要+3个字节,哪么你的总需求量则是5个字节占位,而不是3