数组和指针都是C里面的好东西,但是一旦使用不当,真的会让人抓狂。

下面是写程序时遇到的一次数组越界的经历,感觉对以后写程序有点启发,所以记录下来。

起因:

我想用OLED动态显示一组浮点数,而且浮点数的长度是不定的。

1、如果只是单纯的显示,没有消隐的话,上一次的长数的据残留会影响下一次短长度数据的显示。

2、如果显示一次就清空一次显示区域的话,数据会一直抖动,一开始以为是我刷新频率不够,故把刷新频率由100HZ改为1000HZ,但是效果还是和之前一样!

后来想想也是,不管我把刷新频率改为多少,清空后的空白和显示的数据都是相同的频率。1000hz显示数据,那么也是1000hz的空白。所以会抖动严重。

3、把数据的每一位都取出来单独显示,但是这样就又带来了数据对齐的问题。不爽,不好看,弃之。

4、使用sprintf格式化需要显示的数据为字符串。然后用OLED的显示字符串的方式显示。

于是有了下面这样的程序:

    sprintf((char *)weight_string,"%.1f",weight);        //格式化为字符串
Clear_Left_Num(money_string); //消除残余
OLED_Show_String(,,weight_string); sprintf((char *)price_string,"%d",price);
Clear_Left_Num(money_string);
OLED_Show_String(,,price_string);

这段程序在定时器中断函数中调用。weight 和 price 就是我想显示的浮点数。

先格式化为字符串,然后显示。OLED_Show_String() 的前两个参数是字符的起始显示坐标。

Clear_Left_Num 函数如下:

void Clear_Left_Num(unsigned char *num_string)
{
while(*num_string != '.')
num_string++;
//一位小数点后面的数据用空格刷新
*(num_string+) = ' ';
*(num_string+) = ' ';
*(num_string+) = ' ';
}

思路就是把小数点后一位后面的残余数据用空格刷新。

但是实验现象是在显示完第一行数据之后,本来应该在第二行显示第二个数据,但是他 在第一行数据的后面又显示了第二行的数据!!也就是说第二行数据显示了两次。

为什么会显示两次呢?我程序中就写了一次啊、、、

分析:

既然是显示的问题,那就先看看这个显示函数!

/*----------------------------------
**函数名称:OLED_Show_String
**功能描述:光标处显示字符串,字符串可以用数组表示,unsigned char string_2[] = {"THIS IS A TEST "};
**参数说明:X,Y为坐标
* chr:字符串首地址
**作者:Andrew
**日期:2018.1.24
-----------------------------------*/
void OLED_Show_String(u8 x, u8 y, u8 *chr)
{
u8 j=;
while (chr[j]!='\0')
{
OLED_ShowChar(x,y,chr[j]); x+= ; if(x>){x=;y+=;} //自动换行写 j++;
}
}

原来这个函数会在数组结束之前,显示数组的全部内容。因为数组的最后一个结尾标志是  '\0’

那么,上面第一行一直在显示,说明他可能没有遇到数组结束标识符。

查看数组定义的大小:

unsigned char weight_string[] = {};
unsigned char price_string[] = {};

原来 weight_string 数组的最后一个结束标志被我赋值成了空格。那么他就会一直读取存储在这个数组后面的内存数据,并且给显示出来。也就是所谓的“数组越界”。

幸好我们只是读取显示,并没有改写这个数据!

既然他显示的是第二行的数据,说明第二行的数据就是存储在在这个数组后面的内存中。

查看编译器生成的map文件:

果然,第二个数组紧邻着第一个数组存储。

第一个数组读取越界之后,读到了第二个数组。

到此,问题解决。

总结:

一定要看到程序的内在联系。分析内存虽然困难,但是却是找到烦人bug 的捷径。

一次数组越界的bug经历的更多相关文章

  1. iOS如何彻底避免数组越界

    我们先来看看有可能会出现的数组越界Crash的地方: ? 1 2 3 4 5 6 7 - (void)tableView:(UITableView *)tableView didSelectRowAt ...

  2. Objective-c防止数组越界而崩溃(全局效果)

    数组越界其实是很基本的问题,但是解决起来除了count的判断,还有每个调用的时候都要去判断一遍 对于不明确的数据总会有崩溃的风险 然而 每次调用都判断 那是太累了 so ..runtime&c ...

  3. 数组越界保护与消息传递black机制

    数组越界保护if(index.row <= [array count]) 发送消息[[NSNotificationCenter defaultCenter]     postNotificati ...

  4. 解决Android时时更新listview数组越界问题

    时时更新数据一般出现在金融.股票行业对数据的准确性要求极高情况下使用. 先来看看下面一段代码, public class MainActivity extends Activity { private ...

  5. Android 【问题汇总】列表数组越界的问题

    遇到了一个诡异的问题,ListView发生数组越界(偶尔会),程序崩溃. 错误信息如下: W/dalvikvm( ): threadid=: thread exiting with uncaught ...

  6. iOS 数组越界 Crash加工经验

    我们先来看看有可能会出现的数组越界Crash的地方. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSInd ...

  7. Java中的数组越界问题

    Java中数组初始化和OC其实是一样的,分为动态初始化和静态初始化, 动态初始化:指定长度,由系统给出初始化值 静态初始化:给出初始化值,由系统给出长度 在我们使用数组时最容易出现的就是数组越界问题, ...

  8. java.sql.SQLException之数组越界

    java.sql.SQLException之数组越界 1.具体错误如下: (1)java.sql.SQLException:Parameter index out of range(0<1) ( ...

  9. .NET 下 模拟数组越界

    前面一篇文章提到过 数组越界行为,虽然编译器为我们做了大量的检查工作让我们避免这些错误. 但是我觉得还是有必要模拟一下数组越界,感受一下这个错误. 那么对于.NET来说我们怎么来模拟数组越界呢? 一. ...

随机推荐

  1. Android 几种网络请求的区别与联系

    HttpUrlConnection 最开始学android的时候用的网络请求是HttpUrlConnection,当时很多东西还不知道,但是在android 2.2及以下版本中HttpUrlConne ...

  2. 苹果新的编程语言 Swift 语言进阶(十六)--泛型

    泛型允许你定义一个宽松.可重用的函数或者类型,使用泛型能够避免代码的重复,也能以更清楚和抽象的方式来表达程序的意图. 泛型是Swift语言提供的强大功能之一,Swift提供的许多标准库都使用了泛型来创 ...

  3. Linux常用命令(第二版) --压缩解压缩命令

    压缩解压缩命令: ----------.gz---------- 1.压缩 gzip[GNU zip]: /bin/gzip 格式: gzip 选项 [文件] #压缩文件,压缩后扩展名为.gz,Lin ...

  4. Android Studio相关资料链接

     AndroidStudio中文社区:http://www.android-studio.org/index.php Android studio删除工程项目:http://www.linuxid ...

  5. 将html5项目部署到tomcat上,并实现安卓手机访问

    最近在使用Webstorm开发项目中前端相关的内容,但是涉及到使用ajax技术,不能够跨域访问相关json文件和服务,需要将前端代码部署到tomcat服务器上.但是,如果通过手动拷贝的方式,太过于复杂 ...

  6. iPhone实现自定义多选列表

    好久没更新博客了,今天写了一个自定义的多选列表,可以跟爱学习的各位进行分享,首先我们先来看一下效果图: 一般大家都是用UITableView自己的编辑模式来实现CheckBox的,这里我们用自定义Ce ...

  7. ORM框架--GreenDao 3.0基本使用指南

    0. ORM框架--GreenDao 3.0基本使用指南 1. Gradle 的配置 这里可以参照官方的文档进行最新的配置(本示例的版本等你看到可能就不是最新的了),但是值得注意的一点是,GreenD ...

  8. Demo4

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  9. 东方国信 - 软件开发人员面试问卷(ver1.001.002)

    1.    通用编程知识问卷(所有编程人员必做)... 1 1.1      SQL问卷... 1 1.2      翻译... 2 2.    Java问卷(Java程序员应答,其他跳过)... 2 ...

  10. Android之Drawable

    Android 中图片和常见的颜色都可以是一个Drawable. Drawable可以方便我们做出一些特殊的UI效果,这一点在UI相关的开发工作中尤其重要.其主要优点有: 使用简单,比自定义View成 ...