与堆操作相关的两个函数
malloc
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char *p = malloc(10); //内存随机,未做处理 int i; for(i = 0; i < 10: i++) { printf(“%d “,p[i]); } free(p); return 0; }
运行结果:(linux)
exbot@ubuntu:~/wangqinghe/C/20190630$ ./malloc
0 0 0 0 0 0 0 0 0 0
全是0表示分配的这块内存没有用过。
相同的代码在windows环境下运行必须将
char *p = malloc(10);换成 char *p = (char*)malloc(10);
因为malloc分配的地址是指向void*
不更换过来会报 invalid conversion from ‘void*’ to ‘char*’ 的错误
换过后的运行结果如下:
可以在使用malloc之后使用memset函数来初始化该指针指向的地址大小为0或者-1.(memset)只能初始化这两种值。
char *p = malloc(10);
memset(p,0,10); //初始化所有内存为0
calloc
calloc函数可以直接达成这样的效果:分配内存并且同时初始化为0
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { //char *p = malloc(10); char *p = (char*)calloc(10,sizeof(char)); int i; for(i = 0; i < 10; i++) { printf("%d ",p[i]); } free(p); return 0; }
realloc
想要将两个分配的内存块在一起,可以使用realloc函数
在原有内存基础之上,在堆中间增加连续的内存。
如果原有内存没有连续内存可扩展,那么会重新分配一个空间,将原有的内存copy到新空间,然后释放。
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char *p1 = (char*)calloc(10,sizeof(char)); char *p2 = (char*)realloc(p1,10); int i; for(i = 0; i < 20; i++) { printf("%d ",p2[i]); } free(p2); return 0; }
在p1内存的基础上扩充,并且会自动初始化p1内存大小的内存为0;
若p2内存分配大小大于p1,那么多出来的内存则会有随机值。
char *p2 = (char*)realloc(NULL,10) //等同于malloc;
realloc和malloc只分配内存,不处理。