您的位置:首页 > 其它

数组溢界地址的正确使用: 即 int a[6] 中的 a[-1] 和 a[6] 正确使用

2014-06-24 10:04 302 查看
正如大家所知道的那样:

数组  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]使用来从后往前遍历数组的不对称边界。

尤其当你的数组元素是结构体, 类 等复杂结构时使用这两个地址可以简化操作。(前提是使用指针遍历数组)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐