Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1761877
  • 博文数量: 1493
  • 博客积分: 38
  • 博客等级: 民兵
  • 技术积分: 5834
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-19 17:28
文章分类

全部博文(1493)

文章存档

2016年(11)

2015年(38)

2014年(137)

2013年(253)

2012年(1054)

2011年(1)

分类:

2012-10-11 12:36:33

1.程序代码分析

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <iostream>
  4. using namespace std;
  5. char *fun(void)
  6. {
  7.  char str[]="hello world";//分配于局部数据区。
  8.  return str;
  9. /*
  10. 编译器将提出警告。为什么呢?
  11. 警告如下:
  12. warning: address of local variable ‘str’ returned
  13. return返回的是栈内存的指针。
  14. 栈存储是局部数据区,局部对象在离开函数的时候就被销毁了。所以不能返回一个局部函数的引用,这样的行为是不可预知的。
  15. */
  16. }
  17. char *fun3(void)
  18. {
  19.  char *str="hello world";
  20. /*
  21. str分配于常量数据区,位于静态数据区,它在程序生命周期内恒定不变。但是这里gcc编译时还会有个警告。
  22. warning: deprecated conversion from string constant to ‘char*’;
  23. 结果运行是对应hello world,但是设计理念不对,为什么呢。
  24. char *背后的含义是:给我个字符串,我要修改它。但是分配于常量区的是不能被修改的。合理的方法是把它改成const char*,其含义是给我个字符串我要去读取它。
  25. 改了之后的如下:
  26.   const char *fun3(void)
  27.     {
  28.       const char *="hello world";
  29.       return str;
  30.     }
  31.   对应主函数中的str也改为const char *str=NULL;//这样就不会出现警告了。
  32. */
  33.  return str;
  34. }
  35. void fun1()
  36. {
  37.  static int a=10;
  38. /*
  39. static int a=10;//声明并初始化,此时为初始化赋值,如果这条语句出现在函数中,即使被多次调用,也只会执行一次。
  40. */
  41.  a--;
  42.  printf("%d\n",a);
  43. }
  44. void fun2()
  45. {
  46.  static int b;//声明并使用默认值初始化,在此期间访问会得到静态变脸的系统默认值0。
  47.  b=0;//赋值为0.每次调用时,都赋值为0;
  48.  b++;
  49.  printf("%d\n",b);
  50. }
  51. int main()
  52. {
  53.  char *str1=NULL;
  54.  const char *str2=NULL; 
  55.  unsigned short a=65536;
  56.  a=a+10;
  57.  str1=fun();//str1的内容是垃圾
  58.  str2=fun3();//针对修改后的fun3()
  59.  fun1();
  60.  fun1();
  61.  fun1();
  62.  fun2();
  63.  fun2();
  64.  fun2();
  65.  puts(str1);
  66.  puts(str2);
  67.  cout<<a<<endl;
  68. /*
  69. 为什么是10呢,有符号变量的取值范围-32678~32767;无符号的变量取值0-65535.
  70. 而这里的变量为65536,所以数据发生了溢出,short为两个字节,16位,那么在内存中就变成了10000000000000000,1就会被放到下个字节,代表short的字节就会变成了全零,所以结果0+10=10。
  71. */ 
  72. return 0;
  73. }

  1. 9
  2. 8
  3. 7
  4. 1
  5. 1
  6. 1
  7. v
  8. hello world
  9. 10


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