/*
一道经典的面试题,有时候会搞错。贴出来,希望大家都注意。
*/
char * GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
return p;
};
int main()
{
char *str = NULL;
str = GetMemory(str, 100);
strcpy(str, "hello");
cout << str << endl;
return 0;
}
/*
请问以上程序的输出是什么?
*/
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
};
int main()
{
char *str = NULL;
GetMemory(str, 100);
strcpy(str, "hello");
cout << str << endl;
return 0;
}
/*
没有输出值。
而且,每执行一次GetMemory就会申请一块内存,但申请的内存却不能有效释放,
结果是内存一直被独占,最终造成内存泄露。
*/
/*
如果一定要用指针参数去申请内存,那么应该采用指向指针的指针,传str的地址给函数GetMemory。
代码如下:
*/
void GetMemory(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num); /*
* str和 *p 表示同一个内存单元
*返回申请到的内存的首地址addr给str变量;
*此时str这个字符指针仅仅作为一个内存单元,
*其内容即为addr。
*/
};
int main()
{
char *str = NULL;
GetMemory(&str, 100); /*
*将 str这个字符指针的地址作为实参传递给指针的指针p。
*p和&str内容相同,但不是同一个内存单元。
*/
strcpy(str, "hello");
cout << str << endl;
return 0;
}
/*
运行之后,可以看到预期的hello字符串。
*/
/*
另外可以用函数返回值来传递动态内存。
代码如下:
*/
char * GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
return p;
};
int main()
{
char *str = NULL;
str = GetMemory(str, 100);
strcpy(str, "hello");
cout << str << endl;
return 0;
}
/*
运行之后,可以看到预期的hello字符串。
*/
又积累了一点,加油!
期待早点把自己卖出去!