Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371137
  • 博文数量: 50
  • 博客积分: 1495
  • 博客等级: 上尉
  • 技术积分: 805
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-21 14:19
文章分类

全部博文(50)

文章存档

2011年(47)

2010年(3)

分类: C/C++

2011-04-02 14:29:46

局部变量问题


当子函数结束以后,其局部变量是否被销毁了呢?

 

局部变量存储在栈区,栈区是由编译器自动分配释放。

常量字符串存储在堆区,堆区一般是由程序员分配和释放,否则就由OS回收。

堆和栈的问题请参考:http://blog.chinaunix.net/space.php?uid=25119314&do=blog&id=188248

下面是我写的两个小测试程序:

  1. char *str_func_1()

  2. {

  3.        char *p;

  4.        p = "hello CJOK";

  5. }

  6.  

  7. char *str_func_2()

  8. {

  9.        char p[12] = "hello CJOK";

  10.        return p;

  11. }

  12.  

  13. int main()

  14. {

  15.        char *strp;

  16.        strp = str_func();

  17.        printf("%s\n", strp);

  18.        return 0;

  19. }

 

这是Str_func_1()打印出来的结果:

  1. cjok@ubuntu:~/c$ gcc tst.c -o tst
  2. cjok@ubuntu:~/c$ ./tst
  3. hello CJOK

Str_func_1() 验证了常量字符串存储在堆区,只有当程序结束后才被OS回收掉。

 

这是Str_func_2()打印出来的结果:

  1. cjok@ubuntu:~/c$ gcc tst.c -o tst
  2. tst.c: In function ‘str_func’:
  3. tst.c:8: warning: function returns address of local variable
  4. cjok@ubuntu:~/c$ ./tst 
  5. ���

说明局部变量p[]已经发生了变化,是不是已经被销毁了呢,还不敢下结论。

 

又写了一个测试程序:

  1. int *num_func()

  2. {

  3.        int num = 63178;

  4.        return #

  5. }

  6.  

  7. int main()

  8. {

  9.        int *nump;

  10.        nump = num_func();

  11.        printf("%d\n", *nump);

  12.        return 0;

  13. }

执行结果:

  1. cjok@ubuntu:~/c$ gcc tst.-o tst
  2. tst.c: In function ‘num_func’:
  3. tst.c:14: warning: function returns address of local variable
  4. cjok@ubuntu:~/c$ ./tst
  5. 63178

在编译的时候出现了警告,但是在执行的时候,却打印出正确的结果。很令人费解。

在网上搜罗了大量的文章,我觉得这个讲的不错:

http://tech.cuit.edu.cn/forum/redirect.php?tid=4862&goto=lastpost

子函数结束后,其局部变量就变得不稳定,可能被销毁,也有可能还在,所以建议别用。


 ***如有问题,请指正,谢谢!***

liao.ye@foxmail.com

阅读(7531) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~