• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

如何防止数组越限

9604a3b72d92b876 2019-04-23 浏览量:747
数组越限在编译的时候往往发现不了,烧进单片机里面,莫名奇妙就会跑飞,我知道有些专业的分析工具可以做到,但我们出于爱好玩,肯定用不上coverity之类的工具吧?大家一般是怎么规避的呢?
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 即使是自己写的代码,短时间里是能随时记住自己原来申请了多少空间,但是时间久了还是会忘。

    有时候自己会写个代码说明的文档,但是如果写得长了,自己也不愿意看自己写的东西。。。。​

    没有特别的方法,就是多用IDE的代码提示,然后尽量多加注释。

    幸好visual studio的代码提示还挺好用的。

    像int a[100]这样的语句申请内存,在后续写代码时候可以用visual studio的代码提示功能快速定位到那句开头定义语句。比如你打个a,然后让鼠标停留在a上面,int a[100]这句话就在提示里显示了。如果是new(c++的习惯)申请的,也一样。

    像int *a,然后malloc(c的习惯)申请内存的,在申请的那一句话里加入注释。跟着代码提示搜索这个a,应该很快就会定位到申请内存那句话(按搜到的顺序,第一句是定义数组名,第二句就是定义申请内存)。


    如果随时能方便地查询到某个变量申请内存时候的那句话,细心一点还是很容易规避数数组越界的。

    • 发布于 2019-04-24
    • 举报
    • 评论 0
    • 1
    • 0

其他答案 数量:7
  • 规避最好的方法就是养成良好的编程习惯;一般在编程前要整理流程图,计算内存大小,合理分配空间。
    • 发布于2019-04-24
    • 举报
    • 评论 0
    • 0
    • 0

  • 每次调用数组前先对数组的访问偏移进行判断,再操作数组,是一种有效的方式。

    如果不用,只能是自己小心一些,有bug再修复了

    • 发布于2019-04-24
    • 举报
    • 评论 0
    • 0
    • 0

  • 个人常用的两种操作

    1、在进行指针操作之前,先判断一下这个指针是否存在,是否合法

    2、如果一个函数要以数组作为参数,那么一定要有另一个参数,指示允许操作的最大长度,然后在函数里面做限制

    每次调用这个函数时长度一般用sizeof (数组)-1,这样会保险一点

    • 发布于2019-04-24
    • 举报
    • 评论 0
    • 0
    • 0

  • 越界和程序有关,平时写代码需要记得数组的大小,使用指针一定不要超过数组范围,如果是上位机编程可以用c#语言,安全性比较高,不会存在越界情况
    • 发布于2019-04-24
    • 举报
    • 评论 0
    • 0
    • 0

  • 在定义数组时采用一个 宏(常量,因为C不支持const,也不能用变量来初始化数组)来明确其大小,每次访问时检测下标是否在范围内。

    • 发布于2019-04-24
    • 举报
    • 评论 0
    • 0
    • 0

  • 这里我用的是断言函数assert_param()来实现。

    用宏定义规定数组的长度:

    typedef enum{
    ARRAY_HEAD = 0
    ARRAY_TAIL = 19
    }ARRAY_TypeDef;
    #define IS_ARRAY_SUBscript(SUBscript) (((SUBscript)>=ARRAY_HEAD) && ((SUBscript)<= ARRAY_TAIL))

    /* 定义时 */
    uint16_t array[20]={0};
    /* 我们直接设置20,这里肯定越界了 */
    subscript = 20;
    /* 使用时这里subscript可以作为参数传递进来 */
    assert_param(IS_ARRAY_SUBscript(subscript));

    执行到assert_param()时,由于subscript不在0~19之间,所以程序会去到void assert_failed(uint8_t *file uint32_t line);

    我们可以在​assert_failed函数中用Printf打印到串口提示,或者直接给个死循环在里面,这样就知道数组在运用时出错了。




    • 发布于2019-04-24
    • 举报
    • 评论 0
    • 0
    • 0

  • 单片机资源有线,用不了高级编程语言的特性,主要还是靠自己灵活的大脑来管理呀,哈哈
    • 发布于2019-04-25
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

如何防止数组越限