免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
51 [报告]
发表于 2009-12-02 14:28 |只看该作者

回复 #49 yonwen 的帖子

43楼的拥护者。

论坛徽章:
0
52 [报告]
发表于 2009-12-02 14:29 |只看该作者
原帖由 yonwen 于 2009-12-2 14:19 发表
char *getMem()
{
    char *p;
    p = malloc(100);
    return p;
}

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


因为getMem中的参数p 所分配的 ...

牛比

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
53 [报告]
发表于 2009-12-02 14:35 |只看该作者
原帖由 casablinca 于 2009-12-2 13:36 发表
最明显的错误就是:子程序用局部变量申请内存;退出子程序后,申请的内存自动释放;所以没有结果

奇强

论坛徽章:
0
54 [报告]
发表于 2009-12-02 14:38 |只看该作者

回复 #43 casablinca 的帖子

释放局部变量的内存, 又不释放其指向的内存块。

论坛徽章:
0
55 [报告]
发表于 2009-12-02 14:38 |只看该作者
  哄哄,嗡嗡

论坛徽章:
0
56 [报告]
发表于 2009-12-02 14:40 |只看该作者
我个人认为程序没有问题,只是编程习惯不好。

但面试人也不应该说人家C基础太差呀。

论坛徽章:
0
57 [报告]
发表于 2009-12-02 14:42 |只看该作者
原帖由 yonwen 于 2009-12-2 14:19 发表
char *getMem()
{
    char *p;
    p = malloc(100);
    return p;
}

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


因为getMem中的参数p 所分配的 ...


你这样认为是不对的,p虽然是局部变量,但是p指向的可不是(malloc得到的不是局部变量)
return p是可以得到malloc的空间的

你的理解还不够深刻,我半年前也是你这样理解的

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
58 [报告]
发表于 2009-12-02 14:45 |只看该作者
原帖由 bgifu 于 2009-12-2 09:18 发表
这段代码会有什么错误
我答的是申请内存后未判空,直接用sprintf写入会有问题
对方说这不是问题所在。我想了一下malloc申请的内存虽然没有初始化为0,但是sprintf写入也不应该有问题。
对方说c的基础太差了,郁闷
=====================

面试官都喜欢装13,不必理会


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


这代码可能有的错误:

0. 没有判断p是否为空,直接传递给sprintf了。
1. 头文件,lz说不考虑
2. main中return 0;  在C中是需要的,C++中不需要
3. p = malloc(100);  在C++中需要转型,C中不需要
4. getMem(void); 在C中最好这样写,不过调用者也没有乱来


代码错误好像没了。 其他的可能就不是代码本身的错误了。
1. 比如应该用sprintf还是 snprintf?
2. 比如getMem分配, main释放。

这些错误就是莫须有了。 上面的代码清清楚楚明明白白的显式出:
1. 100肯定能存放下"hello"
2. getMem和main处于同一翻译单元,不存在链接到不同crt的说法

非要说这2个地方有错 —— 而且不加任何提示 ——  完全是面试官的装13行为。


ls上提到一些,本不是错误:
1. malloc( 100 ); vs  malloc( 100 * sizeof(char) );
都对,sizeof(char) 恒等于1

2. sprintf( p , "hello" ); vs sprintf( p , "%s" , "hello" );
后者是脱裤子放屁,就好像:
printf("hello world\n" ); 非要写成 printf("%s\n","hello world" );



所以……  真正算错误的,可能就只有0 : 没有判断p是否是空指针就传递给sprintf了……
lz也回答到这点了……

然后被面试官说"不是问题所在","基础太差"…… 哎……
我替你鄙视他一下



更新: 关于 "2. main中return 0;  在C中是需要的,C++中不需要", 我out了……  于是更新一下……
2中的C指的是C89, 如果无返回语句,程序终止的状态是无定义的。
C99中采用了C++的作法:main可以省略返回语句(仅main函数可以),终止状态是有定义的,0 。

[ 本帖最后由 OwnWaterloo 于 2009-12-4 16:45 编辑 ]

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
59 [报告]
发表于 2009-12-02 14:45 |只看该作者
原帖由 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);
}

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



主要原因就在於這個malloc上,这个getMem()的函数,返回的时候是不确定的,因为无法保证这个p指针参量在函数退出后是否仍然存在并指向之前的空间(这个由编译器实现决定)。

而且一旦这个getMen()失败了,那么main中的这个sprintf就有问题了。。。。因为main中的p指针指向的空间没有正常初始化

论坛徽章:
0
60 [报告]
发表于 2009-12-02 14:46 |只看该作者
呵呵,楼主在哪里面试碰到的啊,那个产品线的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP