免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: bgifu
打印 上一主题 下一主题

[C] 去腾讯面试碰到个题目,求助一下 [复制链接]

论坛徽章:
0
171 [报告]
发表于 2009-12-04 13:18 |只看该作者

回复 #1 bgifu 的帖子

char *getMem()
{
    char *p;
    p = malloc(100);
    return p;
}

int main(void)
{
    char *p = getMem();
    sprintf( p, "hello" );
    free(p);
}

p是在堆栈上的一个变量,getMem一结束,该变量就被销毁了,而他指向的内存却永远不会被释放。

我想这应该是错误的所在吧

论坛徽章:
0
172 [报告]
发表于 2009-12-04 13:23 |只看该作者
void setMem(char **pMe)

{

   *pMe = (char*)malloc(sizeof(char) * 1000);

}

int main(void)
{
    char *p;
    setMem(&p);
    sprintf( p, "hello" );
    free(p);
}

[ 本帖最后由 deargodzw 于 2009-12-4 13:25 编辑 ]

论坛徽章:
0
173 [报告]
发表于 2009-12-04 13:26 |只看该作者
原帖由 bgifu 于 2009-12-2 09:18 发表
char *getMem()
{
    char *p;
    p = malloc(100);
    return p;
}

int main(void)
{
    char *p = getMem();
    sprintf( p, "hello" );
    free(p);
}

这段代码会有什么错误
我答的是 ...

楼主,对于C而言,上述代码没有错误,只是存在潜在问题而已。
重复一次:楼主所帖代码完全正确!

[ 本帖最后由 x2 于 2009-12-4 14:14 编辑 ]

论坛徽章:
0
174 [报告]
发表于 2009-12-04 13:38 |只看该作者
原帖由 hobbs136 于 2009-12-4 13:05 发表
其实我觉得我们不用去笑话别人,因为无论谁都可能会犯过此类错误。由于对事物(这里指c语言)了解的不够充分而对某些现象(这里指代码片段)妄下定论。
多看书学习,少一些争论,有益身心健康啊。

是不能笑话别人。
但是可以指出应该怎么做以后才不会错。
至于看书,看我的签名。

估计这几天就靠这个帖子活着了,省得无聊。
再奉上篇短文。希望能让一些人打开思路:
http://blog.chinaunix.net/u/12783/showart_376700.html

[ 本帖最后由 fera 于 2009-12-4 13:41 编辑 ]

论坛徽章:
0
175 [报告]
发表于 2009-12-04 13:51 |只看该作者
原帖由 woyaoying 于 2009-12-3 17:55 发表
http://man.chinaunix.net/develop/c&c++/c/c.htm

7.4指针参数是如何传递内存的?

       如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1中,Test函数的语句GetMemory(str, 200)并 ...

这个说法貌似没解决问题呀,难道是sprintf的问题?
我运行了一下没发现什么问题呀,内存分配也正确,内存释放也正确...

论坛徽章:
0
176 [报告]
发表于 2009-12-04 13:54 |只看该作者
原帖由 deargodzw 于 2009-12-4 13:18 发表
char *getMem()
{
    char *p;
    p = malloc(100);
    return p;
}

int main(void)
{
    char *p = getMem();
    sprintf( p, "hello" );
    free(p);
}

p是在堆栈上的一个变量,getMem ...

malloc分配的内存被正确销毁了

论坛徽章:
0
177 [报告]
发表于 2009-12-04 13:57 |只看该作者
关于指针、传参、返回值的问题,这个论坛和很多教科书里面都有很详细的阐述。可是大家为什么还在一遍一遍的问呢?相信这个版面很多大牛都不止一次回答过这样的问题,也讲得很精辟,所以这个帖子除了ownwaterloo之流,没有大牛出现了。
所以——“中国人是不读书的。”

[ 本帖最后由 fera 于 2009-12-4 14:08 编辑 ]

论坛徽章:
0
178 [报告]
发表于 2009-12-04 13:58 |只看该作者
原帖由 hobbs136 于 2009-12-3 13:58 发表
2.在getMem函数中return p,返回的是p所指向的内存地址,而不是p本身,所以你在getMem中执行printf("%d\n",p)和在main中执行printf("%d \n",p)其结果是同一个内存地址,但是如果你在两个函数中分别执行printf("%d\n",&p),其结果却不相同,这说明getMem 堆栈中的p变量和main中p变量是不同的两个变量,但是其值却相同,而在系统执行完getMem函数后,如何将p的值返回给调用函数,这个可能需要其他一些机制,这个我不太清楚,希望哪位仁兄不啬赐教。

从此贴可以得到无穷的乐趣

论坛徽章:
0
179 [报告]
发表于 2009-12-04 14:04 |只看该作者
原帖由 mcemil 于 2009-12-4 13:58 发表

从此贴可以得到无穷的乐趣

其实前半部分都正确,就是最后一句,搞笑了。

论坛徽章:
0
180 [报告]
发表于 2009-12-04 14:16 |只看该作者
原帖由 fera 于 2009-12-4 13:38 发表

是不能笑话别人。
但是可以指出应该怎么做以后才不会错。
至于看书,看我的签名。

估计这几天就靠这个帖子活着了,省得无聊。
再奉上篇短文。希望能让一些人打开思路:
http://blog.chinaunix.net/u/1 ...


我们都是精英主义下的可怜虫。
中国人是不读书的。
不要崇拜哥,哥只是个愤青的传说。
想不到哥也引领了一次中关村服装时尚。

上面是你的签名,拜读了。

难道你认为我第一次回帖说的还不够明白么,还有134楼woyaoying的回复?大部分人看见长篇大论就没有了把帖子读完的耐性,更何况我那点说明才几个字,所以后面还有那么多人在说一些不着调的东西。
很多时候,问题的答案就在普通的陈述中,却因为那陈述没有直接说“嘿,小子,这就是那题的答案”而让人熟视无睹。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP