zoukankan      html  css  js  c++  java
  • C之变量初始化的重要性

    #include <stdio.h>

    int add_range(int low, int high)
    {
    int i, sum;
    for (i = low; i <= high; i++)
    sum = sum + i;
    return sum;
    }

    int main(void)
    {
    int result[100];
    result[0] = add_range(1, 10);
    result[1] = add_range(1, 100);
    printf("result[0]=%d result[1]=%d ", result[0], result[1]);
    return 0;
    }

      1 root@ubuntu:/opt/liuzw# gdb ./test
      2 GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
      3 Copyright (C) 2012 Free Software Foundation, Inc.
      4 License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
      5 This is free software: you are free to change and redistribute it.
      6 There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
      7 and "show warranty" for details.
      8 This GDB was configured as "i686-linux-gnu".
      9 For bug reporting instructions, please see:
     10 <http://bugs.launchpad.net/gdb-linaro/>...
     11 Reading symbols from /opt/liuzw/test...done.
     12 (gdb) i locals                                
     13 No frame selected.                         //没有变量
     14 (gdb) n
     15 The program is not being run.            //没有开始直接下一步是不对的
     16 (gdb) start
     17 Temporary breakpoint 1 at 0x8048415: file test.c, line 14.
     18 Starting program: /opt/liuzw/test 
     19 
     20 Temporary breakpoint 1, main () at test.c:14
     21 14        result[0] = add_range(1, 10);    //开始运行程序,经过定义变量,执行了第一条语句
     22 (gdb) i locals                                
     23 result = {-1208188928, 2, 134513196, -1207960576, -1207963660, -1207963660, -1209922512, 1, -1208104168, -1208058708, 0, 0, 0, 0, 0, 
     24   0, 0, -1208104168, 0, 0, 0, 3, -163754450, 1011, 0, -1209886408, -1207959944, -1207984804, -1209921992, 0, 38, -1209734771, 0, 0, 1, 
     25   2224, -1208104120, -1208104872, 134513228, -1209884328, 134513148, 1, -1209313744, -1209313186, -1073745400, -1207963660, 
     26   -1207960880, -1073745164, -1073745232, -1208058151, -1073745264, 134513148, -1073745288, -1207960972, 0, -1208104120, 1, 0, 1, 
     27   -1207961320, 0, 0, 0, -1208205324, -1073745298, -1073745297, 1, -1209312327, -1073745297, -1073745298, 0, -1208008724, -1073745164, 
     28   0, 0, -1209728909, 134513228, 0, 12648448, 1, -1073744675, 47, -1073745220, -1208205324, 134513776, 134520820, 1, 134513373, 
     29   -1208204316, 13, 134520820, 134513809, -1, -1209728570, -1208205324, -1209728427, -1208036736, 0, 134513785, -1208205324}   
     30                                                 //整形数组定义未初始化,内容为内存中随机值
     31 (gdb) s    
     32 add_range (low=1, high=10) at test.c:6
     33 6        for (i = low; i <= high; i++)     //带跳转函数的下一步命令:执行到第一条函数调用处,并执行了子函数经过变量定义后的第一条语句
     34 (gdb) i locals 
     35 i = 0                                            //查看当前变量值,i因为被形参low赋值0所以为有效值,sum因为没有被初始化,值为内存中随机数
     36 sum = -1208060323
     37 (gdb) n    
     38 7            sum = sum + i;                //不跳转函数的下一步命令:执行了累计和函数
     39 (gdb) i locals 
     40 i = 1                                            //经过累计和函数后,i变量执行到i++,所以增加1为1
     41 sum = -1208060323                         //经过累计和函数后因为sum = -1208060323、i=0,累加赋值sum还是-1208060323
     42 (gdb) n   
     43 6        for (i = low; i <= high; i++)    //不跳转函数的下一步命令,执行了for函数判断
     44 (gdb) i locals  
     45 i = 1                                            //i由于被for一轮循环后的i++已经增为1
     46 sum = -1208060322                        //sum经过+i,已经从-1208060323增大到-1208060322
     47 (gdb) n                                        
     48 7            sum = sum + i;
     49 (gdb) i locals
     50 i = 2                                            //经过累计和函数后,i变量执行到i++,所以增加1为2
     51 sum = -1208060322
     52 (gdb) n
     53 6        for (i = low; i <= high; i++)
     54 (gdb) i locals 
     55 i = 2                                            //经过累计和函数后因为sum = -1208060322、i=2,累加赋值sum为-1208060320
     56 sum = -1208060320
     57 (gdb) n
     58 7            sum = sum + i;
     59 (gdb) i locals 
     60 i = 3                                            //经过累计和函数后,i变量执行到i++,所以增加1为3,因为还没有继续累加,保持sum = -1208060320
     61 sum = -1208060320
     62 (gdb) n
     63 6        for (i = low; i <= high; i++)
     64 (gdb) i locals 
     65 i = 3                                            //经过累计和函数后因为sum = -1208060320、i=3,累加赋值sum为-1208060317
     66 sum = -1208060317
     67 (gdb) n
     68 7            sum = sum + i;
     69 (gdb) i locals
     70 i = 4
     71 sum = -1208060317
     72 (gdb) n
     73 6        for (i = low; i <= high; i++)
     74 (gdb) i locals
     75 i = 4
     76 sum = -1208060313
     77 (gdb) n
     78 7            sum = sum + i;
     79 (gdb) i locals
     80 i = 5
     81 sum = -1208060313
     82 (gdb) n
     83 6        for (i = low; i <= high; i++)
     84 (gdb) i locals
     85 i = 5
     86 sum = -1208060308
     87 (gdb) n
     88 7            sum = sum + i;
     89 (gdb) i locals
     90 i = 6
     91 sum = -1208060308
     92 (gdb) n
     93 6        for (i = low; i <= high; i++)
     94 (gdb) i locals
     95 i = 6
     96 sum = -1208060302
     97 (gdb) n
     98 7            sum = sum + i;
     99 (gdb) i locals
    100 i = 7
    101 sum = -1208060302
    102 (gdb) n
    103 6        for (i = low; i <= high; i++)
    104 (gdb) i locals
    105 i = 7
    106 sum = -1208060295
    107 (gdb) n
    108 7            sum = sum + i;
    109 (gdb) i locals
    110 i = 8
    111 sum = -1208060295
    112 (gdb) n
    113 6        for (i = low; i <= high; i++)
    114 (gdb) i locals
    115 i = 8
    116 sum = -1208060287
    117 (gdb) n
    118 7            sum = sum + i;
    119 (gdb) i locals
    120 i = 9
    121 sum = -1208060287
    122 (gdb) n
    123 6        for (i = low; i <= high; i++)
    124 (gdb) i locals
    125 i = 9
    126 sum = -1208060278
    127 (gdb) n
    128 7            sum = sum + i;
    129 (gdb) i locals
    130 i = 10
    131 sum = -1208060278
    132 (gdb) n                                
    133 6        for (i = low; i <= high; i++)    //执行了for判断
    134 (gdb) i locals                        
    135 i = 10                                        //判断后达成,此时值sum继续累加10
    136 sum = -1208060268
    137 (gdb) n                                        
    138 8        return sum;                            //执行了子函数返回
    139 (gdb) i locals
    140 i = 11
    141 sum = -1208060268
    142 (gdb) n
    143 9    }
    144 (gdb) i locals
    145 i = 11
    146 sum = -1208060268
    147 (gdb) n                                //下一个函数调用处,此处整形数组为未初始化
    148 main () at test.c:15
    149 15        result[1] = add_range(1, 100);
    150 (gdb) i locals
    151 result = {-1208060268, 2, 134513196, -1207960576, -1207963660, -1207963660, -1209922512, 1, -1208104168, -1208058708, 0, 0, 0, 0, 0, 
    152   0, 0, -1208104168, 0, 0, 0, 3, -163754450, 1011, 0, -1209886408, -1207959944, -1207984804, -1209921992, 0, 38, -1209734771, 0, 0, 1, 
    153   2224, -1208104120, -1208104872, 134513228, -1209884328, 134513148, 1, -1209313744, -1209313186, -1073745400, -1207963660, 
    154   -1207960880, -1073745164, -1073745232, -1208058151, -1073745264, 134513148, -1073745288, -1207960972, 0, -1208104120, 1, 0, 1, 
    155   -1207961320, 0, 0, 0, -1208205324, -1073745298, -1073745297, 1, -1209312327, -1073745297, -1073745298, 0, -1208008724, -1073745164, 
    156   0, 0, -1209728909, 134513228, 0, 12648448, 1, -1073744675, 47, -1073745220, -1208205324, 134513776, 134520820, 1, 134513373, 
    157   -1208204316, 13, 134520820, 134513809, -1, -1209728570, -1208205324, -1209728427, -1208036736, 0, 134513785, -1208205324}
    158 (gdb) s
    159 add_range (low=1, high=100) at test.c:6
    160 6        for (i = low; i <= high; i++)
    161 (gdb) i locals
    162 i = 11
    163 sum = -1208060268
    164 (gdb) n
    165 7            sum = sum + i;
    166 (gdb) i locals
    167 i = 1
    168 sum = -1208060268
    169 (gdb) n
    170 6        for (i = low; i <= high; i++)
    171 (gdb) i locals
    172 i = 1
    173 sum = -1208060267
    174 (gdb) n
    175 7            sum = sum + i;
    176 (gdb) i locals
    177 i = 2
    178 sum = -1208060267
    179 (gdb) s
    180 6        for (i = low; i <= high; i++)
    181 (gdb) i locals
    182 i = 2
    183 sum = -1208060265
    184 (gdb) s
    185 7            sum = sum + i;
    186 (gdb) i locals
    187 i = 3
    188 sum = -1208060265
    189 (gdb) quit
    190                     
    gdb调试
  • 相关阅读:
    五大常用算法之一:分治算法
    【Redis实战】双写一致性问题和解决方案
    大厂面试官喜欢这样问Redis,双写一致性、并发竞争、线程模型,我整理好了
    布隆过滤器的原理以及使用场景
    死磕 Redis- 布隆过滤器
    布隆过滤器(Bloom Filter)原理及实现
    布隆过滤器(亿级数据过滤算法)
    Java防止SQL注入2(通过filter过滤器功能进行拦截)
    java项目中如何防止sql注入
    java如入防止sql注入
  • 原文地址:https://www.cnblogs.com/pokerface/p/6650293.html
Copyright © 2011-2022 走看看