在虚拟内存的用户区 中的堆区获取一块指定大小的连续内存,并返回其指针。
(可以类比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;
}