概述

数组下标从0開始,尽管从初学都已经知道,《陷阱与缺陷》重复强调,而在指尖运动中,就有那么几次不小心,让“精子”掉进这个“洞里”!其次,C语言字符串必须以0收尾!

bug:

1-动态malloc或静态分配size大小字符串,存储size个字符,导致无0收尾,逾越警戒线,站在悬崖边了!

2-动态malloc或静态分配size大小字符串,訪问或设置 [ size ] 字符

3-动态malloc或静态分配size大小字符串,没有初始化,导致无0收尾,读取整串越界(VC下常见烫烫。。。,以前一个刚開始学习的人说他看到吓坏了,以为机器要暴喽)幸运的话,能在越界内存中遇到个0结束输出,不幸运喽,段错误,把你当成攻击者,暴力中止!

bug演示样例:

        string = search_get_string_hash_table(word);
if(string == NULL) { //哈希表中不存在此串
string = malloc_str(size);//分配内存,然后拷贝
if(string == NULL)
return ERR_MEM;
strncpy(string, word, size);
string[size + 1] = 0; //bug,->string[size] = 0;注意在malloc_str中分配的是size+1字节,所以最后一个是string[size]
put_string_hash_table(string);//放入哈希表
}
//哈希表中存在此串
return string;

这是个人写的代码,还记得写完strncpy后,立刻在后面来了这句string [ size + 1 ] = 0;收尾的语句。拷贝了size字节,size+1字节收尾,想都不带多想一点的,认为非常自然^_^,敲的还挺潇洒。擦,等到哈系表出现一堆不须要的字符串后,不潇洒了。尽管非常低级,可是总会发生。尽管平时不会犯,熬夜加班后就是可能发生。这就是细节决定成败,四两拨千斤的活生生样例。

解决的方法:

1-动态分配用调用memset(addr, 0, size),静态 = { 0 }初始化,养成习惯

2-訪问边界字符时候,比較下标和大小是不是差1

3-假设须要逐个訪问,那么逆序递减訪问数组,下标以0结束是个不错选择,可是字符串一般不可行!字符串没有倒序输出的。

4-最笨的方法:牢记数组下标范围[0 - size-1],使用时候多瞅两眼!

5-自己封装须要的接口

6-使用C++string库,它会简化你紧张的心情

字符串数组越界bug(2)的更多相关文章

  1. 一次数组越界的bug经历

    数组和指针都是C里面的好东西,但是一旦使用不当,真的会让人抓狂. 下面是写程序时遇到的一次数组越界的经历,感觉对以后写程序有点启发,所以记录下来. 起因: 我想用OLED动态显示一组浮点数,而且浮点数 ...

  2. OC ---- 字符串 数组 iOS学习-----细碎知识点总结

    NSString *urlString = [NSString stringWithFormat:@"http://www.apple.com"];        // 获取字符串 ...

  3. C语言数组:C语言数组定义、二维数组、动态数组、字符串数组

    1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include &l ...

  4. 墨菲定律与 IndexOutOfBoundsException(数组越界异常)

    今天维护又反馈了一问题过来,查询试卷时报数组越界异常: 2017-02-28 10:45:24,827[ERROR] HttpException[10.32.111.7:60446:2D07867BE ...

  5. LeetCode随缘刷题之Java经典面试题将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成

    今天给大家分享一个Java经典的面试题,题目是这样的: 本题是LeetCode题库中的49题. 将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成 举个例子:输入["eat&qu ...

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

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

  7. java求字符串数组交集、并集和差集

    import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.Ma ...

  8. Javascript-常用字符串数组操作

    字符串的操作在编写Js的过程中是不可避免的 因为它太多的API 还有相似的API让我们很头痛 为了避免以后遇到模拟两可的问题 还是做个笔记比较好 把常用的字符串操作记录下来成笔记 方便以后查找 No1 ...

  9. Matlab 之 字符串数组查找

    Matlab的优势在于向量操作,字符串操作往往费时费力,但是如果能充分利用Matlab自带的一些函数,也可以取得不错的效果.下面就介绍一下字符串数组查找的小技巧. 字符串数组我通常会选择应用cell格 ...

随机推荐

  1. Dragger简介

    转自:http://www.apkbus.com/blog-705730-60435.html 什么是依赖注入 如果我们想要注入依赖,首先要理解依赖是什么.简单的说,依赖是我们代码中两个模块之间的耦合 ...

  2. BestCoder Round 59 (HDOJ 5500) Reorder the Books

    Problem Description dxy has a collection of a series of books called “The Stories of SDOI”,There are ...

  3. 给控制器添加工具栏(Swift语言)

    //懒加载工具条 private lazy var toolBar: UIToolbar = UIToolbar() //设置底部的工具条 private func setToolBar() { // ...

  4. 基于AFNetworking3.0的网络封装

    1.创建名为HTTPMethod(自己随便起名字)的头文件 2.导入AFNetworking头文件(在github上下载最新版): #import "AFNetworking.h" ...

  5. hdu 1829 基础并查集,查同性恋

    A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  6. CSS分别设置Input样式(按input类型)

    当你看到<input>这个html标签的时候,你会想到什么?一个文本框?一个按钮?一个单选框?一个复选框?……对,对,对,它们都对.也许你可能想不到,这个小小的input竟然可以创造出10 ...

  7. Linux定时任务命令crontab

    作为一个php码农,linux接触总是很少,但又是必须会的一项技能,今天学到的linux命令是crontab命令. 注:以下总结基于Ubuntu 12.04 去/etc目录下看看 先去Ubuntu的/ ...

  8. sunJCE or ibmJce,was服务器下使用des的注意点

    最近开发了一个应用,在tomcat下一切ok,到was上有报错. 打开debug日志,没有异常?? 继续调查发现是我们的程序引用了一个sun很久以前的jar.这个jar需要单独打开message日志 ...

  9. 黑马程序员——C语言开门片内存分析

    iOS培训,iOS学习---------型技术博客.期待与您交流!------------ 一.各种进制的总结 1.二进制 (1) 在c语言中二进制以0b开头,输出二进制格式没有固定的格式,自定义输出 ...

  10. JSP与Servlet之间传值

    Jsp与Servlet之间的传值有两种,一种是Jsp传值给Sevlet,另一种是Servlet传值给Jsp:使用request.response对象完成传值,具体实现如下: 1.JSP传值给Servl ...