经常遇到程序看似没有问题,其实暗藏陷阱。今天列举一个典型问题
void GetMemory(char *p)
{
p=(char *)malloc(100);
}
void Test(void)
{
char *ptr=null;
GetMemory(ptr);
}
该函数的输出是什么呀
以上是一个出错程序题下面来分析错误原因
//这是原来的函数,使用的是值传递方式
void GetMemory(char *p)
{
p=(char *)malloc(100);
}
//这是正确的内存分配函数,使用的是双重指针,传递进来的是str的指针地址,*p就是原来的strvoid GetMemory2(char **p)
{
*p=(char*)malloc(100);
}
//这是使用引用的内存分配函数void GetMemory3(char* &p)
{
p=(char*)malloc(100);
}
void Test(void)
{
char *sptr=NULL;
GetMemory(ptr); // 该函数做的工作是 p=str, p=malloc(100); 和str一点关系都没有,ptr=NULL;
//GetMemory2(&ptr); //该函数做的工作是 char**p=&ptr, ptr=*p=malloc(100),内存分配成功
//GetMemory3(ptr); // 传递的是str的引用,函数内的 p还是ptr,分配成功
printf("%s\n", ptr); //输出只能是空,而且程序一运行就会出现段错误