免费注册 查看新帖 |

Chinaunix

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

我也输个题.. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-28 10:59 |只看该作者 |倒序浏览
输个好玩的题。

#include <stdio.h>
char *p;
int *get()
{
int q;
return &q;
}
void fun2()
{
(*p)--;
}
int fun()
{
int i;
for (i = 0; i < 10; i++)
{
  printf("%d\n", i);
  fun2();
}
return 0;
}
int main(int argc, char* argv[])
{
p = (char *)get();
fun();
return 0;
}

输出什么?..大家注意栈的进出

论坛徽章:
0
2 [报告]
发表于 2008-09-28 11:06 |只看该作者
test27.cpp: In function `int* get()':
test27.cpp:5: warning: address of local variable `q' returned

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
3 [报告]
发表于 2008-09-28 11:07 |只看该作者
我没看出来有什么好玩的.
除了p指的地方不对,在没看出来什么好玩的.

论坛徽章:
0
4 [报告]
发表于 2008-09-28 11:15 |只看该作者
哈哈...

这个程序就是因为
int *get()
{
int q;
return &q;
}
引用,造成异常。


要是一个工程的话,这里可能产生两种错误。

第一种:
for (i = 0; i < 10; i++)
{
  printf("%d\n", i);
  fun2();
}
运行输出0,然后退出,不再执行以下函数。


第二种:
大家把 char *p 改为int *p
p = (char *)get();
-> p = (int *)get();

这里就死循环了。

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
5 [报告]
发表于 2008-09-28 11:17 |只看该作者
原帖由 typadam 于 2008-9-28 11:15 发表
哈哈...

这个程序就是因为
int *get()
{
int q;
return &q;
}
引用,造成异常。


要是一个工程的话,这里可能产生两种错误。

第一种:
for (i = 0; i < 10; i++)
{
  printf("%d\n", i);
  ...



我的是第三种,输出0-9,正常退出...
难道你用的也是VC 6.0

论坛徽章:
0
6 [报告]
发表于 2008-09-28 11:18 |只看该作者
我就输出个0....

gcc version 3.4.4 20050721 (Red Hat 3.4.4-2)

不过我是用g++编译的.

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
7 [报告]
发表于 2008-09-28 11:19 |只看该作者
原帖由 5毛党党员 于 2008-9-28 11:18 发表
我就输出个0....

gcc version 3.4.4 20050721 (Red Hat 3.4.4-2)

不过我是用g++编译的.


我0-9,VC 9.0

论坛徽章:
0
8 [报告]
发表于 2008-09-28 11:22 |只看该作者

回复 #7 egmkang 的帖子

#include <stdio.h>

int *p;

int *get()
{
        int q;
        return &q;
}

void fun2()
{
        (*p)--;
}

int fun()
{
        int i;
        for (i = 0; i < 10; i++)
        {
                printf("%d\n", i);
                fun2();
        }

        return 0;
}

int main(int argc, char* argv[])
{
        p = (int *)get();
        fun();
        return 0;
}


要注意p的指针类型

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
9 [报告]
发表于 2008-09-28 11:25 |只看该作者
原帖由 typadam 于 2008-9-28 11:22 发表
#include

int *p;

int *get()
{
        int q;
        return &q;
}

void fun2()
{
        (*p)--;
}

int fun()
{
        int i;
        for (i = 0; i < 10; i++)
        {
                printf("%d\n", i);
                fun2();
        }

        retu ...




#include <stdio.h>
#include <stdlib.h>

int *p;

int *get()
{
        int q;
        return &q;
}

void fun2()
{
        (*p)--;
}

int fun()
{
        int i;
        for (i = 0; i < 10; i++)
        {
                printf("%d\n", i);
                fun2();
        }
        return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    p = (int *)get();
        fun();
        system("pause");
        return 0;
}

运行结果:

0
1
2
3
4
5
6
7
8
9
请按任意键继续. . .

论坛徽章:
0
10 [报告]
发表于 2008-09-28 11:32 |只看该作者
_tmain 和main 产生的汇编是一样吗?
_tmain 是unicode.
栈应该不一样了吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP