在虚拟内存的用户区 中的堆区获取一块指定大小的连续内存,并返回其指针。
(可以类比Java中的堆 、实例对象、对象名,内存泄漏的知识,高级语言设计都是遵循操作系统的一些基础原理的,别觉得有啥不一样)。
- #include
-
- void *malloc(unsigned int size);
- 功能:在堆区开辟指定长度的空间,并且空间是连续的
-
- 参数:
- size:要开辟的空间的大小
-
- 返回值:
- 成功:开辟好的空间的首地址
- 失败:NULL
- 1 #include
- 2 #include
- 3
- 4 char *fun()
- 5 {
- 6 //char ch[100] = "hello world";
- 7
- 8 静态全局区的空间只要开辟好,除非程序结束,否则不会释放,所以
- 9 如果是临时使用,不建议使用静态全局区的空间
- 10 static char ch[100] = "hello world";
- 11
- 12 堆区开辟空间,手动申请手动释放,更加灵活
- 13 使用malloc函数的时候一般要进行强转
- 14 char *str = (char *)malloc(100 * sizeof(char));
- 15 str[0] = 'h';
- 16 str[1] = 'e';
- 17 str[2] = 'l';
- 18 str[3] = 'l';
- 19 str[4] = 'o';
- 20 str[5] = '\0';
- 21
- 22 return str;
- 23 }
- 24
- 25 int main(int argc, char *argv[])
- 26 {
- 27 char *p;
- 28 p = fun();
- 29 printf("p = %s\n", p);
- 30
- 31 return 0;
- 32 }
- #include
- void free(void *ptr)
- 功能:释放堆区的空间
- 参数:
- ptr:开辟后使用完毕的堆区的空间的首地址
- 返回值:
- 无
- //动态申请内存
- int *p =(int *)malloc(sizeof(int)*100);
-
- //释放p指向的空间 (但是p仍然指向该位置)
- free(p);
-
- //预防野指针(p重新指向0地址)
- p=NULL;
- #include
- void * calloc(size_t nmemb,size_t size);
- 功能:在堆区申请指定大小的空间
-
- 参数:
- nmemb:要申请的空间的块数
- size:每块的字节数
- 返回值:
- 成功:申请空间的首地址
- 失败:NULL
char *p=(char *)calloc(3,100);
- #include
- void* realloc(void *s,unsigned int newsize);
- 功能:在原本申请好的堆区空间的基础上重新申请内存,新的空间大小为函数的第二个参数 如果原本申请好的空间的后面不足以增加指定的大小,系统会重新找一个足够大的位
- 置开辟指定的空间,然后将原本空间中的数据拷贝过来,然后释放原本的空间
- 如果newsize比原先的内存小,则会释放原先内存的后面的存储空间, 只留前面的newsize个字节
-
-
- 参数:
- s:原本开辟好的空间的首地址
- newsize:重新开辟的空间的大小
-
- 返回值:
- 新的空间的首地址
-
- int main()
- {
- char *p;
- p=(char *)malloc(100);
- //接下来,可以用p指向的内存了
-
- p="hello world";//p指向别的地方了,保存字符串常量的首地址
-
- //从此以后,再也找不到你申请的100个字节了。则动态申请的100个字节就被泄露了
-
- return 0;
- }
- void fun()
- {
- char *p;
- p=(char *)malloc(100);
- //接下来,可以用p指向的内存了
- ...
- }
-
- int main()
- {
- //每调用一次fun泄露100个字节
- fun();
- fun();
- return 0;
- }
解决方式1:
- void fun()
- {
- char *p;
- p=(char *)malloc(100);
- //接下来,可以用p指向的内存了
- ...
- free(p);
- }
-
- int main()
- {
- fun();
- fun();
- return 0;
- }
解决方式2:
- char * fun()
- {
- char *p;
- p=(char *)malloc(100);
- //接下来,可以用p指向的内存了
- ...
- return p;
- }
-
- int main()
- {
- char *q;
- q=fun();
- //可以通过q使用 ,动态申请的100个字节的内存了
- //记得释放
- free(q);
- //防止野指针
- q = NULL;
-
- return 0;
- }