动态开辟堆区空间
malloc free
#include <stdlib.h>
void *malloc(size_t size);
功能:在堆区开辟空间
参数:size:开辟空间大小(字节)
返回值:
成功:返回开辟空间首地址
失败:返回NULL
void free(void *ptr);
功能:释放堆区空间
参数:开辟空间首地址
返回值:无
int main()
{
int * p = (int *)malloc(sizeof(int)*10);
if(p == NULL)
{
printf("malloc err\n");
return -1;
}
//对空间进行操作
int i;
for(i=0;i<10;i++)
*(p+i)=i;
//操作完成,及时释放
free(p);
p=NULL;
}
注意:
1.在使用手动开辟空间时,要注意内存泄漏
当指针指向开辟的堆区空间后,又对指针重新赋值,则没有指针指向开辟空间首地址,
这就会导致内存泄漏
2.在使用完堆区空间后及时释放空间
如果在子函数中开辟堆区空间,想要在主函数拿到堆区空间首地址有两种方法:
1.返回值2.地址传递
1.返回值
```c
char * fun()
{
char *p = (char *)malloc(32);
strcpy(p, "hello");
return p;
}
int main()
{
char *m =fun();
printf("%s\n", m);//hello
free(m);
m=NULL;
}
2.地址传参
void fun(char **p)//p == &m => *p == m
{
*p =(char *) malloc(32);//m=首地址
strcpy(*p, "hello");
}
main()
{
char *m = NULL;
fun(&m);
printf("%s\n", m);//hello
free(m);
m=NULL;
}