例题1:
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
答:无法正常运行
因为GetMemory接收的是str,p是形参只是实参str的一份临时拷贝,所以给形参p开辟空间对于实参str没有影响,但由于 malloc开辟的空间没有被free释放,所以开辟空间成功,但是开辟的空间不属于str,p作为形参在函数结束以后也被释放。
例题2:
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
答:无法正常运行
因为在函数GetMemory中,函数返回的时候,函数中的数组其实会释放,空间还给了操作系统,所以返回的地址其实是没有意义的。虽然str接收了p,但是p所指向的数组里的内容已经被释放。
例题3:
void GetMemory(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
答:可以正常运行,但是存在内存泄漏
GetMemory函数接收函数指针可直接对str进行修改,但是因为malloc开辟了动态空间,必须要free释放所开辟的空间,题目中没有free(str)所以会存在内存泄露。
例题4:
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, "hello");
free(str);
if(str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
答:无法正常运行
在第一次strcpy后,str指向的内存里存入了hello,但是接着就free(str)释放了str,即将str指向的空间还给了操作系统,时str依然指向刚刚的位置,并且hello还存在,进入if循环语句。但是此时指向的空间已经不属于str,此时的str是一个野指针,所以world无法拷贝到str指向的空间。