Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371473
  • 博文数量: 87
  • 博客积分: 983
  • 博客等级: 准尉
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-25 07:20
文章分类

全部博文(87)

文章存档

2016年(1)

2015年(3)

2014年(55)

2013年(13)

2012年(15)

分类: C/C++

2014-01-16 21:04:31

下面四个子函数的代码,起区别就是定义的变量的属性(是不是静态的)以及有没有初始化:
通过下面对代码的简单调试,可以简单的得出:
       static int cnt = 0;他仅仅起的是一个初始化的作用,即我认为,在若干次执行test1()函数时,static int cnt = 0; 只在第一次test1()函数被调用的时候初始化为0,当test1()第二次或更多次被调用时,cnt为保存的上一次的值。
   对于非静态变量,若不初始化(见test4()函数),它将会是一个随机的数字。在本程序中未被初始化的静态变量(见test3()函数)值为0,但因为用静态变量就是为了要用它的记忆功能,所以最好初始化一下。

点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>

  3. void test1(void)
  4. {
  5.     static int cnt = 0;    //静态变量,初始化为0
  6.     int i;
  7.     printf("-------------test1-------------\n");
  8.     printf("cnt1_1 = %d\n",cnt);
  9.     for (i = 0; i < 2; i++)
  10.     {
  11.         cnt++;
  12.     }
  13.     printf("cnt1_2 = %d\n",cnt);
  14.     printf("\n");
  15. }

  16. void test2(void)
  17. {
  18.     int cnt = 0;        //非静态变量,初始化为0
  19.     int i
  20.     printf("-------------test2-------------\n");
  21.     printf("cnt2_1 = %d\n",cnt);
  22.     for (i = 0; i < 2; i++)
  23.     {
  24.         cnt++;
  25.     }
  26.     printf("cnt2_2 = %d\n",cnt);
  27.     printf("\n");
  28. }

  29. void test3(void)
  30. {
  31.     static int cnt;    //静态变量,未初始化
  32.     int i;
  33.     printf("-------------test3-------------\n");
  34.     printf("cnt3_1 = %d\n",cnt);
  35.     for (i = 0; i < 2; i++)
  36.     {
  37.         cnt++;
  38.     }
  39.     printf("cnt3_2 = %d\n",cnt);
  40.     printf("\n");
  41. }

  42. void test4(void)
  43. {
  44.     int cnt;        //非静态变量,未初始化
  45.     int i;
  46.     printf("-------------test4-------------\n");
  47.     printf("cnt4_1 = %d\n",cnt);
  48.     for (i = 0; i < 2; i++)
  49.     {
  50.         cnt++;
  51.     }
  52.     printf("cnt4_2 = %d\n",cnt);
  53.     printf("\n");
  54. }

  55. int main()
  56. {
  57.     int i;
  58.     for(i = 0; i < 4; i++)
  59.     {
  60.         test1();
  61.         test2();
  62.         test3();
  63.         test4();
  64.     }
  65.     return 0;
  66. }

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

chen_chuang2014-01-25 15:29:05

realyongshi:局部变量是在堆栈中间存储和分配的,每次调用后释放,所以需要进行初始化。局部静态变量和全局变量都是存储在静态区的。

恩,多谢高手

回复 | 举报

realyongshi2014-01-23 14:59:57

局部变量是在堆栈中间存储和分配的,每次调用后释放,所以需要进行初始化。局部静态变量和全局变量都是存储在静态区的。

realyongshi2014-01-23 14:59:54

局部变量是在堆栈中间存储和分配的,每次调用后释放,所以需要进行初始化。局部静态变量和全局变量都是存储在静态区的。

chen_chuang2014-01-20 15:25:25

fireaxe:局部变量是在stack中的,只有在调用这个函数时才临时分配,函数退出时则释放资源,没有固定存储空间,所以使用前需要程序员自己初始化。
静态变量,不管是在函数中的还是在函数外面的,都有固定的存储空间。本质上来说与静态变量就是全局变量。
至于初始化问题,所有未初始化的全局变量与静态变量都会被统一初始化成0

多谢高手指点

回复 | 举报

fireaxe2014-01-17 13:18:44

局部变量是在stack中的,只有在调用这个函数时才临时分配,函数退出时则释放资源,没有固定存储空间,所以使用前需要程序员自己初始化。
静态变量,不管是在函数中的还是在函数外面的,都有固定的存储空间。本质上来说与静态变量就是全局变量。
至于初始化问题,所有未初始化的全局变量与静态变量都会被统一初始化成0