免费注册 查看新帖 |

Chinaunix

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

[C] 有关自动变量的小问题,牛人勿入。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-25 14:03 |只看该作者 |倒序浏览
  1. #include<stdio.h>
  2. #include<string.h>
  3. char *get(void)
  4. {
  5.         char *p="china";
  6.         return p;
  7. }
  8. void main(void)
  9. {
  10.         char *q;
  11.         q=get();
  12.         printf("%s\n",q);
  13. }
复制代码
函数get中的自动变量p赋给了q,然后又输出q,我觉得写的不对。为什么照样可以输出?

论坛徽章:
0
2 [报告]
发表于 2010-04-25 14:11 |只看该作者
"china"属于常量,,可能被存储在了常量区,或者全局区,,所以你这个代码可以正常执行

论坛徽章:
0
3 [报告]
发表于 2010-04-25 14:15 |只看该作者
算了,既然我不是牛人,就来回答这个简单问题吧。

get虽然返回的是一个局部变量(指针),但是巧的是,由于程序中的字符串采用了“硬编码”,编译执行后,“china”处于程序的静态区,而且这个位置在get返回后是不会被销毁或者回收的,所以p指向的总是一个有效的地址,于是就可以大摇大摆的赋给q而没有问题了。

话是这么说,不过要真写程序,这么干的人一定会被老板骂地……

论坛徽章:
0
4 [报告]
发表于 2010-04-25 14:19 |只看该作者
如果在函数中把这种常量赋给一个指针,那么这个指针和main函数里的常量无异了?不解

论坛徽章:
0
5 [报告]
发表于 2010-04-25 14:21 |只看该作者
本帖最后由 poke006 于 2010-04-25 14:30 编辑

呵呵,你们都是牛人,

论坛徽章:
0
6 [报告]
发表于 2010-04-25 16:17 |只看该作者
"china"应该是在全局区

论坛徽章:
0
7 [报告]
发表于 2010-04-25 16:21 |只看该作者
"china"应该是在全局区
河边一支柳 发表于 2010-04-25 16:17



    我本来不想发言的,建议你去看书。

论坛徽章:
0
8 [报告]
发表于 2010-04-25 16:34 |只看该作者
我本来不想发言的,建议你去看书。
prolj 发表于 2010-04-25 16:21



    那要看编译器具体怎么实现的。。。实现在全局区,也未尝不可

论坛徽章:
0
9 [报告]
发表于 2010-04-25 16:42 |只看该作者
难道你要跟我讨论gcc的实现么?
好像C标准有规定/建议的,我不是字典,不要让我提供页码,我记不住。
要照你那么说,我完全可以放在代码段,或者自己规定一个chian段,没啥意义。

论坛徽章:
0
10 [报告]
发表于 2010-04-25 16:47 |只看该作者
首先谢谢p咦的回答,很可能纠正了我以前的一个错误,但c标准确实没看过

我以前的理解就是这样

                          low   address   
        +--------------------------------+   
        |       _TEXT   class   'CODP'                       |   
        |                 code                                         |   
        +--------------------------------+--   
        |       _DATA   class   'DATA'                       |     
        |           initialized   data                       |     
        +--------------------------------+   DGROUP   
        |       _BSS   class   'BSS'                           
        |           uninitialized   data                    
        +--------------------------------+--   
        |                                                               
        |           FREE   SPACE                                 
        +--------------------------------+   
        |                                                               
        |           STACK                                            
        +--------------------------------+  
        |                                                               
        |           HEAP                                               
        +--------------------------------+   
        |                                                                 
        |           FREE   SPACE                                   
        +--------------------------------+   
                    high   address
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP