免费注册 查看新帖 |

Chinaunix

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

关于指针的一点疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-09 21:47 |只看该作者 |倒序浏览
看到一个问题,关于返回数组地址的,有一点疑惑.我们知道当函数结束后,定义在函数内的数组回被释放,但是在这个例子中*c为什么还是回打印出t 呢?
#include <stdio.h>
char* f()
{
        char b[]="test";
        printf("the address is %p\n",b);
        return b;
}
int  main()
{
        char *c;
        c=f();
       // printf("the address is %p\n",c);
        printf("the c is %s the *c is %c\n",c,*c);
}
这个函数的运行结果是:
the address is 8047a70
the c is $??the *c is t
当我将"//"好去掉后,结果是:
the address is 8047a70
the address is 8047a70
the c is $?? the *c is $
请高手解释下原因,谢谢!

论坛徽章:
0
2 [报告]
发表于 2006-12-09 22:25 |只看该作者
等待牛人解答。

论坛徽章:
0
3 [报告]
发表于 2006-12-09 22:33 |只看该作者

关于指针

其实自己找本书看看应该就可以很容易的理解这个问题了。
f()函数中的b[]是在栈里分配的内存空间,在return的时候就是返回了这段栈内存的地址,这样就很容易理解为什么函数内部和外部打印的地址是同样的值。

论坛徽章:
0
4 [报告]
发表于 2006-12-09 22:57 |只看该作者
地址是一样,但是主函数里printf("the c is %c",*c);为什么会输出t,底层是怎样组织的?
能说说汇编是怎么实现的吗? vc 里头的汇编代码我看不懂!

论坛徽章:
0
5 [报告]
发表于 2006-12-09 23:03 |只看该作者
"test" 是全局常量串,在 rodata 中

论坛徽章:
0
6 [报告]
发表于 2006-12-10 13:07 |只看该作者
楼上正解

论坛徽章:
0
7 [报告]
发表于 2006-12-10 13:23 |只看该作者
我没明白各位的意思,我的疑问是为什么加上打印语句后,*c的值会不一样?难道说改变了c的地址吗?
另外,test 的位置,我不知道rodata是什么意思,但是我认为test的位置是放在stack中的.

论坛徽章:
0
8 [报告]
发表于 2006-12-10 13:29 |只看该作者
没有printf的情况下,stack里面的内容还在( “test"), 只是EBP/ESP变化了。
加上printf, 那么printf将会使stack向下延伸,覆盖了原来stack的内容,所以打印的内容就变了。

另外,rodata的说法不对。

论坛徽章:
0
9 [报告]
发表于 2006-12-10 13:49 |只看该作者
程序中的 b 是一个非静态数组对象,它的生存期仅限于 f() 函数执行期间。f() 函数执行结束之后 b 也就不存在了。如果此时再通过指针去试图访问这个生存期已经结束的对象(这是常见的一种错误现象),那么根据标准的规定其行为是未定义的,得到或者得不到预期的结果都不奇怪。

把数组声明为静态数组、或者直接返回字符串(字符串本身其实就是一个字符型的静态数组)都可以避免此程序的无定义行为。

论坛徽章:
0
10 [报告]
发表于 2006-12-10 13:50 |只看该作者
原帖由 柳五随风 于 2006-12-10 13:29 发表
没有printf的情况下,stack里面的内容还在( “test"), 只是EBP/ESP变化了。
加上printf, 那么printf将会使stack向下延伸,覆盖了原来stack的内容,所以打印的内容就变了。

另外,rodata的说法不对。


同意,
char *p = "test"
和char p[] = "test"是不一样的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP