zoukankan      html  css  js  c++  java
  • 数组溢界地址的正确使用: 即 int a[6] 中的 a[-1] 和 a[6] 正确使用

    正如大家所知道的那样:

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

    尤其当你的数组元素是结构体。 类 等复杂结构时使用这两个地址能够简化操作。(前提是使用指针遍历数组)

  • 相关阅读:
    记录下首次开通流量主,开心开心
    微信小程序之本地缓存
    在使用ef的情况下,有Migrations文件,想要直接生成数据库
    CSS 设置圆角div和阴影效果
    小程序UI库(UI组件)
    没有找到可以构建的 NPM 包---小程序开发
    php 接口参数对象转数组方法
    tp5框架获取随机n条
    php图片上传base64接口上传
    php如何实现定时任务,php定时任务方法,最佳解决方案,php自动任务处理
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6943393.html
Copyright © 2011-2022 走看看