调试中代码可能出现的问题,以及如何写出一个bug少的代码

一.解释代码可能出现什么情况:

         可能出现死循环;

         首先来调试查看,是哪里出现问题,我们发现到i=12之后,继续进行arr[12]和i都变成0了。

         这时我们来取两个值的地址,发现两个值的地址一样

        造成这样的原因是因为越界访问了,在计算机中,我们的内存会划分为三个区,分别是,栈区,堆区,静态区。其中栈区里存放的是局部变量和函数形参,使用习惯是先使用高地址空间,再使用底地址空间。

       所以如题,先创建i,在创建arr数组,且局部变量是放在栈区上的,那么arr一定在i的下面,且数组随着变化的增长是由低到高变化的,所以如图。

        那么如果在内存分配的过程中,i和arr之间恰好就留了两个整形,当我们在循环的过程中向后越界,i就有可能和arr[12]用同一地址,所以当我们更改arr[12]时就有可能把i更改掉,从而导致死循环。

       注意,这个代码是在特殊的环境下构成的,环境不一样运行的结果就可能不一样。比如我们调整到Release中,结果就完全不同,这是因为Release版本对代码进行了优化

         i的地址变道arr[12]下面去了,所以环境不同导致结果不同。

二、在代码中使用assert,以及尽量使用const

         如strcop的实现

          这样写是不是很啰嗦,所以我们可以改成:

        其中assert的意义是”断言“,这里是指断言arr1和arr2不是野指针,如果有一个是野指针则会报错。如:

         const的作用则是确保arr1所指向的内容不会被修改,注意const在*左边是保证指针指向的内容不会被修改,指针变量本身是可以被修改的,在右边则是确保指针变量本身不会被修改,而指针所指向的内容是可以被修改的。 如果两边都有const则指针变量本身以及指针变量所指向的地址都不能被修改。

         则定义strlen函数也是一样的。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值