| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1715 人关注过本帖
标题:深信服的一道笔试题,C语言大神来看看
只看楼主 加入收藏
星闪夜空
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:50
专家分:119
注 册:2012-9-15
结帖率:100%
收藏
已结贴  问题点数:40 回复次数:38 
深信服的一道笔试题,C语言大神来看看
下列代码期望输出结果是1111,请找出fun1….fun4中存在的问题,并简单说明原因:
int* fun1(int a){
   int ret = a;
}
int* fun2(int a){
   int* p = (int*)malloc(sizeof(int));
   *p = a;
   return p;
}
int* fun3(int a){
   static int ret;
   ret = a;
   return &ret;
}
int* fun4(int a){
  return &a;
}
int main()
{
  printf(“%d”, *fun1(2)-*fun1(1));
  printf(“%d”, *fun2(2)-*fun2(1));
  printf(“%d”, *fun3(2)-*fun3(1));
  printf(“%d”, *fun4(2)-*fun4(1));
  return 0;
}
我主要对printf(“%d”, *fun3(2)-*fun3(1));
        printf(“%d”, *fun4(2)-*fun4(1));
这两个输出的结果不明白,如果能详细分析这两个输出的结果的,给40分。
搜索更多相关主题的帖子: return C语言 
2013-10-17 09:23
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:2 
第一、你的代码无法通过编译
第二、你的代码中含有全角符号

DO IT YOURSELF !
2013-10-17 09:30
星闪夜空
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:50
专家分:119
注 册:2012-9-15
收藏
得分:0 
回复 2楼 wp231957
第一,既然存在问题,肯定是无法编译通过的,你可以注释掉printf(“%d”, *fun1(2)-*fun1(1));这条语句再编译。
第二,其中有几个中文符号,修改一下就可以了,相信难不倒你。
2013-10-17 09:38
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
玩那

DO IT YOURSELF !
2013-10-17 09:39
星闪夜空
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:50
专家分:119
注 册:2012-9-15
收藏
得分:0 
回复 4楼 wp231957
#include <stdio.h>
#include <stdlib.h>

int* fun1(int a){
    int ret = a;
}
int* fun2(int a){
    int* p = (int*)malloc(sizeof(int));
    *p = a;
    return p;
}
int* fun3(int a){
    static int ret;
    ret = a;
    return &ret;
}
int* fun4(int a){
    return &a;
}
int main()
{
    //printf("%d", *fun1(2)-*fun1(1));
    printf("%d\n", *fun2(2)-*fun2(1));
    printf("%d\n", *fun3(2)-*fun3(1));
    printf("%d\n", *fun4(2)-*fun4(1));
    return 0;
}

这是我修改后的代码,能够编译通过。
2013-10-17 09:44
hh373231690
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:138
注 册:2012-10-13
收藏
得分:0 
回复 5楼 星闪夜空
运行结果呢
2013-10-17 09:47
星闪夜空
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:50
专家分:119
注 册:2012-9-15
收藏
得分:0 
回复 6楼 hh373231690
1
0
0
2013-10-17 10:19
hh373231690
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:138
注 册:2012-10-13
收藏
得分:10 
可以解释一下fun3,ret变量被定义为static,LZ可以去看一下静态局部变量的定义,静态局部变量与普通局部变量不同 在本函数结束后 变量分配的地址依然存在 只有当整个程序运行完才会被回收 所以&ret的值没变 所以是0.
至于fun4本身存在问题 需要修改
2013-10-17 10:25
zhaogay
Rank: 7Rank: 7Rank: 7
来 自:宫
等 级:黑侠
帖 子:151
专家分:586
注 册:2013-10-10
收藏
得分:10 
fun1很明显的有问题就不说了,
fun2是没问题的,
fun3,限定词static之后,ret就不会随着函数释放,可以返回去。也没问题
fun4 a是局部变量,fun4之后变量就释放了,c不允许这样,所以编译这样不通过,但是int*p=&a。return p;就可以了,但是这样容易出问题,指不定另个程序就改变a所在的内存的值了。
个人理解,不知道有木有问题。

好好学习,天天想上
2013-10-17 10:33
星闪夜空
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:50
专家分:119
注 册:2012-9-15
收藏
得分:0 
回复 8楼 hh373231690
那么你可以打印出printf("%d\n", 3*(*fun3(2))-*fun3(1));这条语句试试看,看结果是否是2,与你所说的是否吻合。
2013-10-17 10:36
快速回复:深信服的一道笔试题,C语言大神来看看
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019300 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved