免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 89096 | 回复: 211
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-02 09:18 |只看该作者 |倒序浏览
char *getMem()
{
    char *p;
    p = malloc(100);
    return p;
}

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

这段代码会有什么错误
我答的是申请内存后未判空,直接用sprintf写入会有问题
对方说这不是问题所在。我想了一下malloc申请的内存虽然没有初始化为0,但是sprintf写入也不应该有问题。
对方说c的基础太差了,郁闷
=====================

请教下各位这段代码到底有什么严重问题。
=====================

跟头文件包含无关
在main中即使没有显示的调用return或者exit程序也会正常的退出。

void *malloc(size_t size);
这是malloc函数的原型,功能为申请size个字节的内存,初始值不确定。malloc(100),malloc( 100 * sizeof(char) ) 效果无区别。

sprintf确实是不安全的,没有任何绝对的方法能够保证内存不溢出。

#20楼,free只是释放掉p指向的内存以供回收再使用,可是p的地址没有改变,你打出的来的当然还是这个地址上面的值

#43楼,你的意思是说调用getMem之后p地址不再是malloc申请的地址,这样就写入了未知的地址吗?
            刚才写程序测试了一下,getMem里面的p的地址和main调用getMem的地址是一样的。是不是调用getMem之后p的地址已经被系统释放掉了?

刚才写程序用gdb调式看了一下,getMem后p的返回值正常,不是野指针。即使多写几个子函数踩掉栈帧,内部变量p被破坏,但其返回的所指向的内存地址是正确的。
用valgrind程序测试未发现错误和内存泄漏问题。那些说内存泄漏和返回为野指针的朋友能够把问题说的详细点吗?为何从getMem返回的p是野指针?


========================================
不好意思各位,这个帖子已经被顶到这么高了。
帖子里面很多朋友说从getMem返回后内存被自动释放掉,或者返回的p为野指针。我想把这个问题确认一下就可以关帖了。
我写程序测试过返回的p是正常的,而且用内存检测工具检测过未发现内存泄漏的情况。请那些提出此问题的朋友详细讲解下好吗?

========================================
谢谢大家的帮忙,大家看完帖子已经有了答案。内存泄漏和野指针的问题应该被澄清。再次谢谢大家
怎么关闭帖子?

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

论坛徽章:
0
2 [报告]
发表于 2009-12-02 09:30 |只看该作者

回复 #1 bgifu 的帖子

应该是malloc函数用错了

论坛徽章:
0
3 [报告]
发表于 2009-12-02 09:31 |只看该作者
sprintf( p, "hello" );

论坛徽章:
0
4 [报告]
发表于 2009-12-02 09:32 |只看该作者
#include <stdlib.h>
#include <stdio.h>
...
...
...

int main(void) {
...

    free(p);

    return EXIT_SUCESS;
}

=========================
根据楼主所述,正解的答案在这里,******!

理智讨论,勿出脏口,此处屏蔽秽言。

[ 本帖最后由 cugb_cat 于 2009-12-2 13:53 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-12-02 09:34 |只看该作者
机器测试了一下,程序没错,就是没输出东西。改成strcpy(p,“hello”)就行了。

论坛徽章:
0
6 [报告]
发表于 2009-12-02 09:38 |只看该作者
楼上的,本来就没有输出啊,加入printf后就可以看p的内容了

论坛徽章:
0
7 [报告]
发表于 2009-12-02 09:38 |只看该作者
使用前为初始化为NUL,怎么使用,本来就是非空,的。

其他的还真没挑出什么毛病。只是我不会这么写。使用一块我不知道大小的内存,没谱。

论坛徽章:
0
8 [报告]
发表于 2009-12-02 09:45 |只看该作者
p = (char*)malloc(100);  ?

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
9 [报告]
发表于 2009-12-02 09:57 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
10 [报告]
发表于 2009-12-02 09:59 |只看该作者
期待高手讲解
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP