动态内存分配复习
为什么要使用动态内存分配:
在声明数组时,必须用一个编译常量指定数组长度,但是,数组的长度往往只有在运行的时候才能被确定,这是因为它所需要的内存空间取决于输入数据,但是容易浪费空间,又或者容易溢出
malloc和free:
void *malloc(size_t size);
void free(void*pointer);
以上两个为malloc和free的函数原型
如果系统内存不足或者无法满足malloc的内存需求,则会返回NULL,因此使用malloc函数需要检查是否成功
free的参数必须是NULL,或者是malloc、realloc、calloc函数的返回值
calloc和realloc
void *calloc(size_t num_elements,size_t element_size);
void realloc(void* ptr,size_t new_size);
realloc:再次分配内存大小,它可以扩大或者缩小malloc所取得的内存空间,但是如果是扩大的时候,增大的部分不会进行初始化,缩小的化,仅将尾部部分去掉,剩余内容不变,如果原先内存空间大小不可改变,那么realloc函数就会新开辟一个内存空间,然后将原内存空间内容复制进来,所以调用realloc函数时,要创建一个新的指针来接受realloc函数的返回值,最后如果realloc的第一个参数是NULL,那么其作用和工作流程和malloc函数一样
使用动态分配的内存
int *pi;
pi=malloc(100);//分配了100字节,并返回了指向有100字节的内存空间的指针
pi=malloc(25*sizeof(int));//因为pi为整数类型,所以实质为有25个整数的整数数组
int* pi2=pi;
for(int i=0;i<25;i++)
pi2++=0;
for(int i=0;i<25;i++)
pi[i]=0;