内存的动态分配和大小调整
头文件
所需头文件:stdlib.h
动态分配
- 函数:void *malloc(size_t size)
- 函数作用:申请大小为(size_t size)的动态内存,然后返回首地址。
- 注:由于函数返回的是void型指针,所以需强制转换为所需类型指针
//申请4个大小为int类型的内存 #include<stdio.h> #include<stdlib.h> int main() { int *pt; pt=(int*)malloc(4*sizeof(int)); //申请内存 if(pt!=NULL) printf("success"); //判断是否申请成功 return 0; }
大小调整
- 函数:void *realloc(void *ptr, size_t size)
- 函数作用:修改申请的动态内存ptr所管理的字节数,然后返回首地址。
//申请4个大小为int类型的内存,再将申请的内存改为10个int大小 #include<stdio.h> #include<stdlib,h> int main() { int *pt; pt=(int *)malloc(4*sizeof(int)); //申请内存 if(pt!=NULL) printf("success\n"); //判断是否申请成功 if(realloc(pt,10*sizeof(int))!=NULL) printf("SUCCESS!"); return 0; }
释放内存
- 函数:void free(void *ptr)
- 函数作用:释放所申请的动态内存.
//申请4个大小为int类型的内存,再释放 #include<stdio.h> #include<stdlib.h> int main() { int *pt; pt=(int *)malloc(4*sizeof(int)); //申请内存 if(pt!=NULL) printf("success"); //判断是否申请成功 free(pt); return 0; }
例题:
从键盘输入一个字符串,但是字符串长度不知道。请先动态申请10个字符的内存,容量不够时再扩容10个字符,以此类推。最后输出这个字符串
#include<stdio.h> #include<stdlib.h> #define N 10 int main() { char *str,ch; int count=1,i=1,num=0; if((str=(char*)malloc(N*sizeof(char)))==NULL) //先申请10个字符的内存,并判断是否申请成功 printf("ERROR!\n"); while(1){ ch=getchar(); if(ch=='\n') break; //若输入的是换行符,结束循环 i++; if(i==N) { count++; i=1; realloc(str,count*N*sizeof(char)); //内存耗尽,扩大内存 } num++; //num记录写入字符的总数 *(str+num-1)=ch; } *(str+num)='\0'; //给字符串末尾写入空字符 puts(str); free(str); //释放内存 return 0; }