某公司的面试试题,虽然答案已给出,但理解不透澈,大家帮忙看看。该怎么处理
某公司的面试试题,虽然答案已给出,但理解不透澈,大家帮忙看看。
//==================================================
//题一
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
int main(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world ");
printf(str);
return 0;
}
问:运行main函数会有什么结果?
答:程序崩溃。
因为GetMemory 并不能传递动态内存,
main函数中的str一直都是NULL。
strcpy将使程序崩溃。
疑问:为什么会崩溃?
//==================================================
//题二
void GetMemory(char **p)
{
*p = (char *)malloc(100);
}
int main(void)
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "hello world ");
printf(str);
return 0;
}
问:运行main函数会有什么结果?
答:能够输出hello world,但内存泄漏。
疑问:为什么内存泄漏?
------解决方案--------------------
编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。
------解决方案--------------------
题二每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。
//==================================================
//题一
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
int main(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world ");
printf(str);
return 0;
}
问:运行main函数会有什么结果?
答:程序崩溃。
因为GetMemory 并不能传递动态内存,
main函数中的str一直都是NULL。
strcpy将使程序崩溃。
疑问:为什么会崩溃?
//==================================================
//题二
void GetMemory(char **p)
{
*p = (char *)malloc(100);
}
int main(void)
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "hello world ");
printf(str);
return 0;
}
问:运行main函数会有什么结果?
答:能够输出hello world,但内存泄漏。
疑问:为什么内存泄漏?
------解决方案--------------------
编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。
------解决方案--------------------
题二每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。