C++内存问题(很多公司面试的题目,值得一看,看懂了别忘了告诉我)

ZhengboCai 2010-03-18 09:14:15
void GetMemory(char *p)
{
p=(char*)malloc(100);
}

void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str,"helloworld");
printf(str);
}
请问运行Test函数会有什么样的结果?
答:程序崩溃。因为GetMemory并不能传递动态内存,Test函数中的str一直都是NULL。strcpy(str,"helloworld");将使程序崩溃。

char *GetMemory(void)
{
char p[]="helloworld";
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, "hello");
printf(str);
}
请问运行Test函数会有什么样的结果?
答:(1)能够输出hello(2)内存泄漏

以上都是关于内存的问题,我想问第一个为什么说GetMemory不能传递动态内存,而第三个 GetMemory2(char **p, int num)却可以;还有第二个说GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,总之我不懂,最好懂得人能一句一句的解释。
...全文
7906 142 打赏 收藏 转发到动态 举报
写回复
用AI写文章
142 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我记得有4道啊 怎么只有3道
jixinazhangdan 2011-12-01
  • 打赏
  • 举报
回复
问题1示意图链接:
http://hi.csdn.net/attachment/201112/1/928862_13227110117KUl.jpg
jixinazhangdan 2011-12-01
  • 打赏
  • 举报
回复
首先,指针本身也是变量,也占用内存空间。与普通变量不同的是,指针的值是变量的地址。
第1题的内存示意图(注:mem1:str表示:地址为mem1的内存存储str变量):
jixinazhangdan 2011-12-01
  • 打赏
  • 举报
回复
问题3内存示意图:
http://hi.csdn.net/attachment/201112/1/928862_1322720027tpy4.gif
houbaochen 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lxslove 的回复:]
都是挺简单的题目
void GetMemory(char *p)
{
p=(char*)malloc(100);
}
p参数是复制原有指针的值,而不是原来的指针,所以即使p重新指向新的地址,但原来的指针指向的地址不变。
char *GetMemory(void)
{
char p[]="helloworld";
return p;
}
p是局部变量,在离开作用域后栈空间会被回……
[/Quote]
char *GetMemory(void)
{
char p[]="helloworld";
return p;
}
p是局部变量,在离开作用域后栈空间会被回……
这个解释的应该有问题
个人认为合理的解释为:
p[]是一个局部变量(数组),函数返回时返回p的值即数组首地址,但是函数返回时p[]销毁所以返回p指向不明;如果改为char *p = "helloworld"; return p;应该没问题;

一土草三工 2010-04-27
  • 打赏
  • 举报
回复
明白了~~!
caicai999 2010-04-06
  • 打赏
  • 举报
回复
嗯学习了。看很久才懂……
linsen_519 2010-04-05
  • 打赏
  • 举报
回复
大哥们,你们是搞c的 就吧这些东西放c区嘛~~ 这里面哪有一点点c++的东西阿?
挂羊头卖狗肉阿!
mxmkeep 2010-04-05
  • 打赏
  • 举报
回复
恍然大悟..
Thanks!
ljg420811 2010-04-05
  • 打赏
  • 举报
回复
学习一下,3Q
yfx2003 2010-04-05
  • 打赏
  • 举报
回复
学习了,不错
「已注销」 2010-04-04
  • 打赏
  • 举报
回复
说实话,没看懂,慢慢进步吧
lwtsea 2010-04-04
  • 打赏
  • 举报
回复
还是能看懂点点 呵呵 不错
无天 2010-04-03
  • 打赏
  • 举报
回复
mark
oyjw443523 2010-04-03
  • 打赏
  • 举报
回复
学习了,哎,老是不能将书本上的知识和实际联系起来
bigtooth2006 2010-04-02
  • 打赏
  • 举报
回复
刚刚入手C++,先学习学习
phenixpip 2010-04-02
  • 打赏
  • 举报
回复
个人理解:函数调用,通过参数只能单向传值。
而所谓的双向传值,只是通过改变地址中的值来实现的,若要改变地址的值则要传递地址的地址、、、
maiyo 2010-03-28
  • 打赏
  • 举报
回复
解释的很有道理呀~
sunnyheyun 2010-03-28
  • 打赏
  • 举报
回复
11楼讲的对。


[Quote=引用 11 楼 wu_xiangwei 的回复:]
1.
void GetMemory(char *p)
{
p=(char*)malloc(100);
}
该函数中的p是一个临时的指针变量,与调用GetMemory函数的实参不是同一个变量,所以无法返回申请的内存。可以做如下改进 void GetMemory(char* &p);
2.
char *GetMemory(void)
{
char p[]="helloworl……
[/Quote]
aini_for 2010-03-27
  • 打赏
  • 举报
回复
是很经典,收藏了
加载更多回复(120)

64,653

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧