#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define CODE_FIXED
/*
原因:传入pTemp分配内存,但getmem结束后,分配的空间被释放掉了
主函数定义了一个指针pTemp,但是没有给它分配内存,所以pTemp指向是一个无效的地址,
然后子函数参数分配了一个指针char *pStr,这个指针的所有权是子函数的,
当你调用子函数的时候,pTemp的值被复制到了pStr中,此时pStr同样也是一个无效的指针,
当调用malloc后,pStr会分配到一段有效内存空间,但是pTemp仍然指向的是无效空间(pTemp和pStr地址是不一样的,只给pStr分配了),
所以当子函数结束后,pStr作为参数变量,被销毁,那么这段内存虽然分配了,但是却使用不了(内存泄漏了)。
所以正确的方法是用二级指针,让pStr成为指向指针的指针!*pStr将指向pTemp的内存地址,那么对*pStr分配,就是对pTemp分配了
*/
#if defined(CODE_FIXED)
int getmem(char **pStr)//把被调函数getmem的参数该为char **pStr
{
*pStr = (char *)malloc(20);//把pStr改为*pStr
return 0;
}
int main(int argc, char **argv)
{
char *pTemp = NULL;
getmem(&pTemp);//把pTemp改为&pTemp
strcpy(pTemp, "123");
printf("pTemp=%s", pTemp);
return 0;
}
#else
int getmem(char *pStr)
{
pStr = (char *)malloc(20);
return 0;
}
int main(int argc, char **argv)
{
char *pTemp;
getmem(pTemp);
strcpy(pTemp, "123");
printf("pTemp=%s", pTemp);
return 0;
}
#endif
局部变量的特性,除非不传参数,pTemp是全局变量,但这样不现实
最新推荐文章于 2023-08-29 16:22:25 发布