您的位置:首页
数组溢界地址的正确使用: 即 int a[6] 中的 a[-1] 和 a[6] 正确使用
2017-06-05 09:26
316 查看
正如大家所知道的那样:
数组 int a[6] , 编译器阅读到这句数组定义,会为分配6个int 类型的地址;a[0] a[1] a[2] a[3] a[4] a[5]。我们 能够正确的使用这6地址内容来存放数据。而本文想说的是a[0]前一个地址和 a[5] 后一个地址的正确使用。
可能有人会有疑问,这两个地址是非法的。是不同意訪问和使用的。
幸运的是,我们并不须要引用这两个元素。而仅仅是引用这两个元素的地址,而且着脸个地址在全部C语言实现中都是存在的。ANSIC C 标准明白同意这样的使用方法:数组中实际不存在的“溢界”元素地址位于数组所占内存之后,这个地址可用于进行赋值和比較。当然假设要引用元素就是非法的。
可能有人会问,怎样使用?
答案就是“不正确称边界”
解释下就是“当我们使用指针遍历数组元素时使用”
以下是一个简单的样例:
执行结果:
能够看到 for 循环中是使用了 P!=&a[10] 作为循环结束推断条件,是不是感觉有点 STL标准中 iterator 的感觉,对这就是不正确成边界的使用。当然a[-1]使用来从后往前遍历数组的不正确称边界。
尤其当你的数组元素是结构体。 类 等复杂结构时使用这两个地址能够简化操作。(前提是使用指针遍历数组)
数组 int a[6] , 编译器阅读到这句数组定义,会为分配6个int 类型的地址;a[0] a[1] a[2] a[3] a[4] a[5]。我们 能够正确的使用这6地址内容来存放数据。而本文想说的是a[0]前一个地址和 a[5] 后一个地址的正确使用。
可能有人会有疑问,这两个地址是非法的。是不同意訪问和使用的。
幸运的是,我们并不须要引用这两个元素。而仅仅是引用这两个元素的地址,而且着脸个地址在全部C语言实现中都是存在的。ANSIC C 标准明白同意这样的使用方法:数组中实际不存在的“溢界”元素地址位于数组所占内存之后,这个地址可用于进行赋值和比較。当然假设要引用元素就是非法的。
可能有人会问,怎样使用?
答案就是“不正确称边界”
解释下就是“当我们使用指针遍历数组元素时使用”
以下是一个简单的样例:
#include <stdio.h> #include <stdlib.h> int main(void) { int a[10]; int *p; int i=0; for(p=a;p!=&a[10];p++) { *p=i; i++; } for(p=a;p!=&a[10];p++) printf("%d\n", *p); return 0; }程序能够正常执行。使用 gcc编译器 centOS操作系统
执行结果:
[trageday@trageday C_test]$ gcc -o arry_over_test arry_over_test.c [trageday@trageday C_test]$ ./arry_over_test 0123456789 [trageday@trageday C_test]$
能够看到 for 循环中是使用了 P!=&a[10] 作为循环结束推断条件,是不是感觉有点 STL标准中 iterator 的感觉,对这就是不正确成边界的使用。当然a[-1]使用来从后往前遍历数组的不正确称边界。
尤其当你的数组元素是结构体。 类 等复杂结构时使用这两个地址能够简化操作。(前提是使用指针遍历数组)
相关文章推荐
- 数组溢界地址的正确使用: 即 int a[6] 中的 a[-1] 和 a[6] 正确使用
- vector取地址做数组使用
- objective-c 使用NSNumber 将int float long等数据类型加入到数组或字典中
- (2)int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
- char型数组转换为Int(指针的规范使用)
- 实例解析如何正确使用Java数组
- 使用js验证邮件地址的正确输入
- 定义一个数组int[] a = { 3, 0, 0, 4, 8, 2, 9 },从小到大排序后,将5插入正确的位置。
- 【数组】将给定字符串str="1,2,3!4,5,6,0!7,8,9"存入二维数组中。(使用 split(String regex) ) int[][] a
- 使用VSS2005的时候报错:输入正确的服务器地址依然出错了
- int *ptr=(int *)(&a+1),对数组名取地址是取的整个数组的地址
- 数组的首地址,数组名取地址,地址的强制转换为int
- 数组首元素地址和数组地址、int *ptr=(int *)(&a+1)问题的探讨
- 数组的首地址,数组名取地址,地址的强制转换为int
- 【LVL1_7_c】【上机题】【1】使用动态数组,存放10个int类型数据,赋值,再遍历
- System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。 其函数原型是: public static void arraycopy(Object src, int
- MySQL提供IP转换函数,对于IP类型的地址,建议使用int类型存储
- ArrayCopy方法int数组、String数组使用实例
- 取数组地址引发的血案(int*)(&a+1);(int*)((int)a+1);
- jquery的使用----$.each(数组/json数据,function (int/key(变量名随意),value(值变量名) ))