Chinaunix

标题: 有关自动变量的小问题,牛人勿入。 [打印本页]

作者: poke006    时间: 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,我觉得写的不对。为什么照样可以输出?
作者: unistd    时间: 2010-04-25 14:11
"china"属于常量,,可能被存储在了常量区,或者全局区,,所以你这个代码可以正常执行
作者: numdisp    时间: 2010-04-25 14:15
算了,既然我不是牛人,就来回答这个简单问题吧。

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

话是这么说,不过要真写程序,这么干的人一定会被老板骂地……
作者: poke006    时间: 2010-04-25 14:19
如果在函数中把这种常量赋给一个指针,那么这个指针和main函数里的常量无异了?不解
作者: poke006    时间: 2010-04-25 14:21
本帖最后由 poke006 于 2010-04-25 14:30 编辑

呵呵,你们都是牛人,
作者: 河边一支柳    时间: 2010-04-25 16:17
"china"应该是在全局区
作者: prolj    时间: 2010-04-25 16:21
"china"应该是在全局区
河边一支柳 发表于 2010-04-25 16:17



    我本来不想发言的,建议你去看书。
作者: unistd    时间: 2010-04-25 16:34
我本来不想发言的,建议你去看书。
prolj 发表于 2010-04-25 16:21



    那要看编译器具体怎么实现的。。。实现在全局区,也未尝不可
作者: prolj    时间: 2010-04-25 16:42
难道你要跟我讨论gcc的实现么?
好像C标准有规定/建议的,我不是字典,不要让我提供页码,我记不住。
要照你那么说,我完全可以放在代码段,或者自己规定一个chian段,没啥意义。
作者: 河边一支柳    时间: 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
作者: prolj    时间: 2010-04-25 16:53
一般是.rodata段
地址是全局可见的
作者: flw    时间: 2010-04-25 17:17
其实这是一道逻辑题,不是计算机题。

记住:计算机除了保证正确的程序可以得到正确的答案之外,其它什么都不保证!
作者: flw    时间: 2010-04-25 17:23
比如:计算机不保证错误的程序一定能够得到错误的结果。

这是为什么呢?
假如计算机为了保证一定能够得到错误的结果,就一定得先知道正确的结果是什么,
但是你的程序是错误的,因此计算机无法猜测你正确的结果是什么。
所以这是不可能的,因此计算机无法保证。
作者: hua_noend    时间: 2010-04-25 17:37
首先谢谢p咦的回答,很可能纠正了我以前的一个错误,但c标准确实没看过

我以前的理解就是这样

       ...
河边一支柳 发表于 2010-04-25 16:47



   
    heap stack的位置不对 吧。。。。记得高地址是stack,低地址是heap,两者之间是hole.....
作者: pengjianbokobe    时间: 2010-04-25 19:22
回复 13# flw
老江湖啊 ,这么有哲理性。。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2