局部变量中返回指针注意事项
1.简介
数组返回和malloc的指针返回不一样,首先,局部数组是存储在stack的栈中, 当函数运行结束之后,局部变量的数组就会被系统自动释放;其次,局部指针的malloc地址内存是存储在heap的堆中,就算是函数运行结束之后,malloc地址也不能自动释放,只能手动释放!
2.程序对比
//save ret in heap, need ourself free
char *mallocReturn(char* str, char str2[])
{
#define MAX_LEN 50
char *ret = (char*)malloc(sizeof(char) * MAX_LEN);
memset(ret, 0, MAX_LEN);
sprintf(ret, "%s+%s", str, str2);
return ret;
}
//save ret[50] in stack, system free
char *arrayReturn(char* str, char str2[])
{
#define MAX_LEN 50
char ret[MAX_LEN];
memset(ret, 0, MAX_LEN);
sprintf(ret, "%s+%s", str, str2);
return ret;
}
int main(void)
{
printf("=============%s-%s===========\r\n", __DATE__, __TIME__);
char *rev = mallocReturn("1234,", "789");
printf("malloc:%s\n", rev);
//free(rev);
rev = arrayReturn("1234,", "789");
printf("array:%s\n", rev);
printf("\r\n============================================\r\n");
return 0;
}
3.程序运行截图
4.结论
使用malloc申请的内存,有正确的打印,表示处于这个地址的内容在mallocReturn函数运行之后,此地址没有被释放,因为此地址存储在HEAP堆中,所以说需要自己的手动释放,可以一直存储;另外就是使用数组申请的内存,没有正确的打印,表示当arrayReturn运行之后,此地址已经被释放掉了,因为此地址存储在Stack栈中,系统自动释放,,所以对应地址已经不存在数据了。
malloc这样子使用的话,一定需要使用完之后进行释放,不然很容易造成内存泄漏产生内存垃圾等问题