免费注册 查看新帖 |

Chinaunix

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

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

九片_cu 该用户已被删除
111 [报告]
发表于 2009-12-03 12:38 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
112 [报告]
发表于 2009-12-03 12:46 |只看该作者
从C的角度讲,这段代码没什么错误。 问题应该是编码规范的问题。 最大的问题应该是没有遵从谁分配,谁释放的原则。

论坛徽章:
0
113 [报告]
发表于 2009-12-03 13:16 |只看该作者
留个记号,省的将来挨骂

论坛徽章:
0
114 [报告]
发表于 2009-12-03 13:33 |只看该作者
109和110楼说得有问题,p虽然在栈中,但分配的空间是在堆中,而程序最后返回的也是分配空间在堆中的地址,虽然p不存在了,这并不影响随后程序的运行

论坛徽章:
0
115 [报告]
发表于 2009-12-03 13:45 |只看该作者
我觉得比较大的可能性是考官拿错题目了,而拿到的答案还是原来那个

论坛徽章:
0
116 [报告]
发表于 2009-12-03 13:57 |只看该作者
我错了
我也觉得面试官题拿错了

论坛徽章:
0
117 [报告]
发表于 2009-12-03 13:58 |只看该作者
1.设计上有问题,谁分配谁释放。这是上面某位仁兄已经讲过的。整个项目应该有一套完整的内存管理api,例如php语言就有一套完整的模拟c标准库的内存管理api,这保证了及时某块内存没有被及时释放也会在进程结束时内存被释放。

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的值返回给调用函数,这个可能需要其他一些机制,这个我不太清楚,希望哪位仁兄不啬赐教。

3.free(p)只是一个标识,这个大家都知道,并不代表系统禁止这个进程访问该段内存了。我想系统内存实现应该有这类错误检查,即如果某块内存没有被引用,那么未分配内存的访问将会出现错误,现在的机制只是让某个进程不能在没有权限的情况下访问另外一个进程的内存空间,而不禁止其访问未分配的内存空间。


4.总结一下,这个程序最大的毛病就是模块设计上的问题,而不是其他。良好的设计根本不会出现这类代码,也许那个面试官写过。


我再补充一下第2点,如果p的形式为char *p="Hello world";或者 char p[100],这个时候返回p很明显会出错,关于第一个,p及p所指向的空间“Hello world"都是getMem函数的私有物;而对于char p[100],很明显这个数组是由编译器非配在栈中的,函数执行完,那么内存空间消失,而对于例子中,p所指向的内存空间并非私有,应该属于进程私有(不太精确),但不属于进程内某个块代码私有。

[ 本帖最后由 hobbs136 于 2009-12-3 14:06 编辑 ]

论坛徽章:
0
118 [报告]
发表于 2009-12-03 14:37 |只看该作者
原帖由 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);
}

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



要返回 值吧
return 0;

论坛徽章:
0
119 [报告]
发表于 2009-12-03 15:05 |只看该作者

回复 #1 bgifu 的帖子

malloc 返回的是void *,赋值给char *要做显式的转换
NAME
       malloc - a memory allocator

SYNOPSIS
       #include <stdlib.h>

       void *malloc(size_t size);

论坛徽章:
0
120 [报告]
发表于 2009-12-03 15:19 |只看该作者
千万不要去QQ这种土鳖人员太多的公司

他们的宗旨就是用自己掌握的知识考倒别人



这种实现的问题 大多数时候可能跟基础有关 但是能不能写出有用的东西这个不是关键 思路是关键


思路很土鳖 再怎么写也写不出好程序 基础可以在coding过程中不断磨练




原帖由 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);
}

这段代码会有什么错误
我答的是 ...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP