malloc数组
void *malloc(size_t 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
申请的内存空间系统不会进行初始化操做,内部处于随机状态calloccode
void *calloc(size_t nitems, size_t 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)
内存地址
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; }
总结string
realloc
只能从新分配从malloc
calloc
申请到的内存空间,若是分配其它空间绝逼报错不解释,最易出错的在于malloc
是直接申请一块内存,只须要传入你的需求量,而且不会帮你初始化,而calloc
一样是直接申请一块内存但会初始化,传值是个数和单个类型的字节,而realloc
是起到一个从新分配的做用,它的参数须要的是一个目标指针,和分配后这个目标指针的总大小,就比如原先的内存占用是2个字节的,如今须要+3个字节,哪么你的总需求量则是5个字节占位,而不是3