1. 先看代码例子
(1)
void GetMemory(char* p)
{
p = (char*)malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
(2)
void GetMemory2(char** p, int num)
{
*p = (char*)malloc(num);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello world");
printf(str);
}
2. 如果运行这两个程序,会出现什么结果呢?
第一个例子会程序崩溃。第二例子会输出“hello world”,但是,会导致内存泄露。
为什么?
图1
图2
图1中可以看出当指针作为参数传到函数GetMemory函数,函数GetMemory执行完成后,指针src已经别栈空间收回了。这样src就是一个野指针,而且在堆空间开辟的内存也得不到释放。
图2中可以看出src确实是被分配了空间,但是,在堆空间里面申请的空间没有得到释放。如果在Test函数最后一行加上free(src);,那么就ok了