LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1094|回复: 15

c中作用域和生命周期的问题

[复制链接]
发表于 2005-3-12 10:21:12 | 显示全部楼层 |阅读模式
突然想到一个作用域和生命周期的问题,于是就编了一个程序检验一下
[php]#include <stdio.h>

char *beyond_boundary();

int main()
{
  char *p=beyond_boundary();
  printf("Return value is: %s\n",p);
  printf("%X\n",p);
}

char * beyond_boundary()
{
  char *p="auto string";
  printf("%X\n",p);
  return p;
}[/php]
我的设想是这样的,函数中的自动变量应该在栈上分配空间,beyond_boundary()函数中的字符串空间应该在函数调用后就不存在了,printf("Return value is: %s\n",p);这句应该会有segmentary fault才对啊
可是我编译运行时却能正确显示auto string这个字符串
  1. [leo@leo test]$ ./a.out
  2. 8048511
  3. Return value is: auto string
  4. 8048511
  5. [leo@leo test]$ echo $?
  6. 8
复制代码
但返回值非零
我又用gdb跟踪了一下,好像是有点问题,但我看不懂
希望哪位大虾不吝赐教
thx
发表于 2005-3-12 10:27:59 | 显示全部楼层
"auto string" 是 const char * 类型的变量, 它在整个程序的生命周期都有效,至于返回值是因为 main 函数没有返回值:)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-12 11:22:21 | 显示全部楼层
Post by sunmoon1997
"auto string" 是 const char * 类型的变量, 它在整个程序的生命周期都有效,至于返回值是因为 main 函数没有返回值:)

嗯,确实是这样
多谢大虾

但怎样写才能返回auto变量,让程序出现segmentary fault呢?
回复 支持 反对

使用道具 举报

发表于 2005-3-12 11:29:09 | 显示全部楼层
不敢苟同!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-12 11:32:11 | 显示全部楼层
Post by EvilSeed
不敢苟同!

愿听兄台高见
回复 支持 反对

使用道具 举报

发表于 2005-3-12 11:41:48 | 显示全部楼层
你能够正确显示出字符指针变量p,是因为你在main函数中赋值char *p=beyond_boundary(); 这时得p已经不是你函数中的局部变量,而是beyongd_boundary的返回值了.所以没有出现段错误.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-12 11:46:14 | 显示全部楼层
Post by EvilSeed
你能够正确显示出字符指针变量p,是因为你在main函数中赋值char *p=beyond_boundary(); 这时得p已经不是你函数中的局部变量,而是beyongd_boundary的返回值了.所以没有出现段错误.

*p=beyond_boundary()这一句当然不会有错
我是说下一句printf("Return value is: %s\n",p);
p指向的地址如果在栈上的话,应该有可能会出错的
回复 支持 反对

使用道具 举报

发表于 2005-3-12 12:05:19 | 显示全部楼层
对栈的了解不多.printf("Return value is: %s\n",p);这一句的p也是函数的返回值,不是函数的变量.兄台说因为p是const char *变量.我觉得不对,p在函数中一直是auto变量.只是在主函数中变成了函数的返回值.
还有$?是上次程序的返回值还是什么我忘了,兄台提点一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-12 12:29:45 | 显示全部楼层
Post by EvilSeed
对栈的了解不多.printf("Return value is: %s\n",p);这一句的p也是函数的返回值,不是函数的变量.兄台说因为p是const char *变量.我觉得不对,p在函数中一直是auto变量.只是在主函数中变成了函数的返回值.
还有$?是上次程序的返回值还是什么我忘了,兄台提点一下

你误解了sunmoon大虾的意思是“auto string"是const char *变量,p是auto
$?是返回值,这点不错
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-12 12:32:09 | 显示全部楼层
Post by nait


但怎样写才能返回auto变量,让程序出现segmentary fault呢?

顶一下
知道的大虾不吝赐教啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表