c语言数组越界的避免方法
1、尽量显式地指定数组的边界
#define MAX 10 … int a[MAX]={1,2,3,4,5,6,7,8,9,10};
在 C99 标准中,还允许我们使用单个指示符为数组的两段“分配”空间,如下面的代码所示: int a[MAX]={1,2,3,4,5,[MAX-5]=6,7,8,9,10};
在上面的 a[MAX] 数组中,如果 MAX 大于 10,数组中间将用 0 值元素进行填充(填充的个数为 MAX-10,并从 a[5] 开始进行 0 值填充);如果 MAX 小于 10,“[MAX-5]”之前的 5 个元素(1,2,3,4,5)中将有几个被“[MAX-5]”之后的 5 个元素(6,7,8,9,10)所覆盖。
2、对数组做越界检查,确保索引值位于合法的范围之内 传递数组参数的时候,一定要带上传入数组的长度,比如:
void Init(int arr[],size_t arr_len)
{
size_t i=0;
for(i=0;i<arr_len;i++)
{
arr[i]=i;
}
}
arr_len类型一定要无符号,避免负数的副作用。 3、获取数组的长度时不要对指针应用 sizeof 操作符。 单地讲,sizeof 是一个单目操作符,不是函数。其作用就是返回一个操作数所占的内存字节数 下面的函数中,使用sizeof,以为是对的,其实,arr传进来的时候,已经退化为指针,所以等同于 void Init(int *arr)。
void Init(int arr[])
{
size_t i=0;
for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
arr[i]=i;
}
}
4、除此之外,我们还可以通过指针的方式来解决上面的问题,示例代码如下所示:
void Init(int (*arr)[10])
{
size_t i=0;
for(i=0;i< sizeof(*arr)/sizeof(int);i++)
{
(*arr)[i]=i;
}
}
int main(void)
{
int i=0;
int a[10];
Init(&a);
for(i=0;i<10;i++)
{
printf("%dn",a[i]);
}
return 0;
}
现在,Init() 函数中的 arr 参数是一个指向“arr[10]”类型的指针。
需要特别注意的是,这里绝对不能够使用“void Init(int(*arr)[])”来声明函数,编译器会报错:error: sizeof applied to an incomplete type
而是必须指明要传入的数组的大小,否则“sizeof(*arr)”无法计算。但是在这种情况下,再通过 sizeof 来计算数组大小已经没有意义了,因为此时数组大小已经指定为 10 了。
- ListView数据动态更新
- ListView优化和列表首尾使用
- 自定义BaseAdapter
- 使用SimpleAdapter
- 自定义ArrayAdapter
- ListActivity和自定义列表项
- ListView列表数据源——Adapter
- 初识ListView
- 响应Android系统的事件
- ImageSwitcher和TextSwitcher
- Android BLE 基础框架全新改版
- Android 混淆从入门到精通
- 基础篇章:关于 React Native 之 ViewPagerAndroid 组件的讲解
- 基础篇章:关于 React Native 之 DrawerLayoutAndroid 组件的讲解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法