一道内存分配方面的笔试题

来源:百度知道 编辑:UC知道 时间:2024/06/06 09:30:47
笔试题,有参考答案,但看不太懂,哪位能否解释得详细一点,谢了

四、有关内存的思考题(每小题5分,共20分)
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运行Test函数会有什么样的结果?
答:程序崩溃。
因为GetMemory并不能传递动态内存,
Test函数中的 str一直都是 NULL。
strcpy(str, "hello world");将使程序崩溃。
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test函数会有什么样的结果?
答:可能是乱码。
因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原


内容已经被清除,新内容不可知。
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str,

第一个问题:
编译器总是要为函数的每个参数制作临时副本,编译器是这样处理的p的副本假设叫tp,
那么有tp=p,二者的本质是一个变量,这不过这个变量的值为某块内存的首地址,
其实修改了tp的值,使其重新指向一块新内存,但是p为的值为修改,问题来了,不是说,
传的是地址吗?但是并没有修改p的值,p依然指向原内存,只是tp指向了新内存.如果tp指向旧内存,
且修改了旧内存的数据,这就是传说中的传地址的意义。
所以答案是Test函数中的 str一直都是 NULL。
strcpy(str, "hello world");将使程序崩溃。
第二个问题:
这是返回临时指针的问题:编译器会警告的。
char p[]=" ";定义的东西是在栈中的,它有权限的,Test函数运行完,就在栈中消失的,所以返回了是原来的
首地址,但是内容未知
第四个问题:
释放了动态内存,不能在引用,修改数据,建议str=NULL,安全,这是基本问题

我感觉是哪本书上的,想补起来了

呵呵,很经典的笔试题了
<<高质量c/c++编程指南>>、<<程序员面试宝典>>里都有答案
下面链接里也有
http://dev.yesky.com/471/2306471.shtml
http://topic.csdn.net/t/20050302/19/3819503.html

答案说的很明白了啊。

你看不懂,估计是不明白函数 传值 与 传地址 的区别。

比如:
#includ