资讯   |   开发   |   选机中心   |   产品大全 | IBM | 惠普 | 联想 | 戴尔 | 苹果 | 神舟
更多: | 华硕 | 明基 | 方正 | 紫光 | TCL | 夏新 | 联宝 | 宏碁 | 七喜 | 长城 | 清华同方 | 海尔 | 三星 | 东芝 | 索尼 | 富士通 | LG | 技术 | ddnoon
当前位置:笔记本 > 软件开发 >
Advertisement
文章正文

小问题,请教高手

类型:转载   责任编辑:asp.net   日期:2007/05/23


热门软件下载:


   

程序这样写可以正确运行:  
  char   *   GetString()  
  {  
  char   *s="aaaaaaaaaa";  
  return   s;  
  }  
   
  但如果这样写就不能正确运行  
  char   *   GetString()  
  {  
  char   s[]="aaaaaaaaaa";  
  return   s;  
  }  
   
  想必第二个程序段是因为在栈上分配了内存,函数返回时自动回收,但是第一段程序又为什么可以正确运行呢?难道两种定义方式对编译器来讲是不一样的吗?  
  请高手指教。

网友回答:

发表者:kobefly

char   *s="aaaaaaaaaa";//存放在静态存储区,  
  char   s[]="aaaaaaaaaa";局部变量,存在栈中,函数返回就释放了  
  所以

发表者:o1n

同意楼上的。  
  又见到你了。呵呵。

发表者:ftkghost

第一个代码是一个char的指针s指向一个字符串常量(const)的首地址,系统给"aaaaaaaaaa"指定了存储位置,当s出了作用域以后,这个地址并没有返回,因而返回一个指针地址  
  第二个代码是一个char数组,他申请了11个字节的空间  
  但是由于是局部变量   他脱离GetString()后就脱离了作用于,空间被系统收回  
   
  const型变量分配的空间和局部变量分配的空间的地方可能不同吧  
   
  听听下面的高手怎么说!

发表者:UPCC

char   *s="aaaaaaaaaa";//存放在静态存储区  
  ------------------------------------------------------  
  我觉得应该这样说:  
  因为="aaaaaaaaaa";静态字符串,所以在存储的时候存放在“全局变量”区!你返回了指向全局变量的指针在外边当然可以操作了!!

发表者:keiy

看看汇编就知  
  一:  
    ; char   *   GetString()  
    ;  
  push   ebp  
  mov   ebp,esp  
    ;  
    ; {  
    ; char   *s="aaaaaaaaaa";  
    ;  
  @1:  
  mov   eax,offset   s@  
    ;  
    ; return   s;  
    ;  
  ?live1@32:   ;   EAX   =   s  
    ;  
    ; }  
  二:  
  ; char   *   GetString1()  
    ;  
  push   ebp  
  mov   ebp,esp  
  add   esp,-12  
    ;  
    ; {  
    ; char   s[]="aaaaaaaaaa";  
    ;  
  @4:  
  mov   eax,dword   ptr   [$mabmbaia]  
  mov   dword   ptr   [ebp-12],eax  
  mov   eax,dword   ptr   [$mabmbaia+4]  
  mov   dword   ptr   [ebp-8],eax  
  mov   ax,word   ptr   [$mabmbaia+8]  
  mov   word   ptr   [ebp-4],ax  
  mov   al,byte   ptr   [$mabmbaia+10]  
  mov   byte   ptr   [ebp-2],al  
    ;  
    ; return   s;  
    ;  
  lea   eax,dword   ptr   [ebp-12]  
    ;  
    ; }  
    ;

发表者:topcool99

char   *s="aaaaaaaaaa";  
  等价于:  
  char   *s;  
  s="aaaaaaaaaa";  
  s为指针类型,指针指向字符串首地址,当然可以返回字符串。  
   
 

发表者:kobefly

汇编没看懂,不过问题的答案算是大体清楚了。  
  这种运行效果应该一样吧:  
  int   *   GetValue(void)  
  {  
  int   *i=1222; //定义指针,指向静态存储区;  
  return   i;  
  //int   i=122; //不正确,同理于GetString(),在栈上分配空间;  
  //return   &i;  
  }  
   
  int   *i=1222;  
  这里自然不是静态(全局变量)区  
  因为不是字符串  
  字符串是单独对待的  
  这里是一个整数  
  所以是栈中的!  
 

发表者:yl02520

楼住,你确认你说的是对的吗?  
  第一个可以正确运行,第二个不能正确运行?  
  在我看来,两个都是正确的,根本没有错~~  
  尽管1楼说的很不错,但这并不能说明什么问题~~  
  要是你程序有问题,请检查一下别的方面,这个返回值是不会错的~~

发表者:yl02520

不好意思~~  
  我刚刚实验了一下~~  
  的确正如楼住所说~~  
  第2个是错误的  
  我收回上面所说的话~~  
  对不起~~~  
  编程这么久了   出现问题时     我总是找其他方法避开   没有好好琢磨过~~

发表者:yeehya

wildleon(释尊空相)    
  int   *i   =   123;???  
  能通过,通过了运行也不对呀~~  
  只能这样   int   t   =   123;//局部变量  
                    int   *i   =   &t;//这里的i是存储在哪里的呢??  
                    return   i;  
  到是   int   i   =   123;  
            return   &i;虽然发出警告传递的是地址,但是结果是123.  
  估计是对于这样的小段程序,被释放的i的空间在短时间里没有被别的进程征用.(哈哈,说的很土)

发表者:tampoco

在我看来,两个都是正确的,根本没有错~~  
 

发表者:zhaoshichu

这个是真确的,不能说是正确的,他分系统而言,在vc++上运行是错误的,在sun机器上运行是正确的。具体原因正在分析

发表者:zhaoshichu

在sun平台上有一个警告是   returns     address   of   local   variable  
  据我分析是程序不能返回本函数中的局部变量地址。

发表者:keple

学习!!期待

发表者:wujingfu

学习中。


 

 
热门推荐笔记本: IBM笔记本
相关文章:
笔记本相关:
IT技术文章:
webmaster:popbb@126.com   最佳浏览:1024X768 MSIE
©2007 popbb.net All Rights Reserved