免费注册 查看新帖 |

Chinaunix

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

[C] 想麻烦大家帮我解决一下这段代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-04 21:08 |只看该作者 |倒序浏览
今天同事给我说了一些关于char*的事情, 自己不太明白, 所以写了下面的代码, 但是自己分析了半天, 还是不知道为什么会是这样的结果, 所以请论坛里的朋友帮我解释一下.

#include <stdio.h>

char *getString()
{
    char *str = "hello world!";
    return str;
}

int main()
{
    char *str = getString();
    printf("%s\n", str);

    char *str1 = "hello world!";
    printf("%d, %d", str, str1);

    return 0;
}


运行的结果:

  1. hello world!
  2. 4202496, 420496
复制代码


问题:
1. 在getString函数中, str应该是一个局部变量啊, 但是为什么在main函数中还是可以打印出hello world!?
2. 在main函数中的str和str1的地址为什么是一样的?

论坛徽章:
0
2 [报告]
发表于 2008-07-04 21:17 |只看该作者
4202496, 420496
这两个数一样?我不会数数

论坛徽章:
0
3 [报告]
发表于 2008-07-04 21:19 |只看该作者
str是局部变量,里面存放一个地址而已
但"Hello word"是字符串常量,存放在全局/静态区,不是在栈分配的空间

论坛徽章:
0
4 [报告]
发表于 2008-07-04 21:21 |只看该作者

回复 #2 prolj 的帖子

不好意思, 写错了

是都是4202496....

论坛徽章:
0
5 [报告]
发表于 2008-07-04 21:22 |只看该作者
原帖由 zszjxh 于 2008-7-4 21:19 发表
str是局部变量,里面存放一个地址而已
但"Hello word"是字符串常量,存放在全局/静态区,不是在栈分配的空间


这里的全局/静态区怎么理解... 我对这个不是很明白...

论坛徽章:
0
6 [报告]
发表于 2008-07-04 21:24 |只看该作者
原帖由 ncoder 于 2008-7-4 21:08 发表
今天同事给我说了一些关于char*的事情, 自己不太明白, 所以写了下面的代码, 但是自己分析了半天, 还是不知道为什么会是这样的结果, 所以请论坛里的朋友帮我解释一下.

#include

char *getString()
{
   ...


这估计是编译器的一个优化吧
编译器本着不表态不承诺追求自己利益最大化的原则进行优化

因为编译器以及库文档绝不会向你承诺在任何情况下函数返回的栈指针有效。。。 所以编译器可以对局部变量做任何形式的销毁 最简单的方法就是leave it alone 不去管它.... 它在任何时候都可以被合法的覆盖 而因为在某一时候被符合引起了你的非标准操作的错误 则一切原因在你自己

呵呵 不知道这样说 对不对

论坛徽章:
0
7 [报告]
发表于 2008-07-04 21:24 |只看该作者
char *str = "hello world!";

字符串被分在静态数据区,指向他的首地址,他又不会变的,所以return后那个串还在的。

论坛徽章:
0
8 [报告]
发表于 2008-07-04 21:26 |只看该作者

回复 #5 ncoder 的帖子

静态区在程序地址空间的最低处
栈区在程序地址空间的最高处 栈运行时根据函数调用的需要向下增长

论坛徽章:
0
9 [报告]
发表于 2008-07-04 21:27 |只看该作者
常量,放在同一个地方很正常啊,要不多浪费空间啊?

论坛徽章:
0
10 [报告]
发表于 2008-07-04 21:28 |只看该作者
"hello world!"是字符串常量,在只读数据段放着.编译的时候*str指向的内容和*str1都指向的内容都一样,就没必要保存两份了,所以地址一样.
估计就是这个样子.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP