zoukankan      html  css  js  c++  java
  • 总结了一些指针易出错的常见问题(六)

      安全问题与指针误用

    声明和初始化指针(初始化失败)

    误用指针

    释放问题

    指针声明:

    // 宏定义(仅仅是替换)

    #define PINT int*;

    PINT ptr1, ptr2;其实是定义 int* ptr1, ptr2;一个指针,一个整型常量。

    //typedef 命名已有数据类型(优于宏定义)

    typedef int* PINT;

    PINT ptr1, ptr2;

    宏定义和typedef区别参考:预处理命令与用typedef命名已有类型

    //  宏定义  和  typedef区别 
    #include<stdio.h> #define INTPTR1 int* int main() { typedef int* INTPTR2; int a=1; int b=2; int c=3; const INTPTR1 p1=&a;//指针常量,不可修改指向变量的值,但可以改变指向其他变量 const INTPTR2 p2=&b;//常量指针,只读,可修改指向变量的值。 INTPTR2 const p3=&c;//常量指针,只读,可修改指向变量的值。 printf("%d %d %d ",*p1,*p2,*p3); printf("a=%d b=%d c=%d ",a,b,c); p1=&c; *p2=9; *p3=10; printf("%d %d %d ",*p1,*p2,*p3); printf("a=%d b=%d c=%d ",a,b,c); return 0; }

      使用指针之前未初始化指针(野指针)

      处理未初始化指针(不可只依靠检查指针的内容来判断它是否有效)

    总是用NULL来初始化指针

    用assert函数(用来测试指针是否为空值);assert(pi!=NULL);

    若为空值,输出:Assertion failed: pi!=NULL;

    用第三方工具

      指针的使用问题

    缓冲区溢出的几个原因:

    访问数组元素时没有检查索引值

    对数组指针做指针算术运算时不够小心

    用gets这样的函数从标准输入读取字符串

    误用strcpy和strcat这样的函数;

      测试NULL

    用malloc这类函数时一定要检查返回值,否则可能会导致程序非正常终止。

      迷途指针(释放指针后却仍然在引用原来的内存,就会产生迷途指针)

      超过数组边界访问内存

    用下标计算的地址不会检查索引值。

      错误计算数组长度

    将数组传递给函数时,一定要同时传递数组长度,这个信息帮助函数避免越过数组边界。

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    void replace(char buffer[],char replacement,size_t size){
        size_t count = 0;
        while(*buffer!=NULL && count++ <size){
            *buffer = replacement;
            buffer++;
        }
    }
    
    int main()
    {
        char name[8];
        strcpy(name,"Alexander");
        replace(name,'+',sizeof(name));
        printf("%s
    ", name);
        printf("%d
    ", sizeof(name));
    }

       错误使用sizeof操作符

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int main()
    {
        int name[20];
        
        int *pbuffer= name;
        for(int i=0;i<sizeof(name)/sizeof(int);i++)
           {
            *(pbuffer++)=0;
        }
    
        printf("%d
    ", sizeof(name));
    } 

      一定要匹配指针类型

    总是用合适的指针类型来装说句是个好主意。

      有界指针

    有界指针是指指针的使用被限制在有效的区域内。比如说,现在有一个32个元素的数组,禁止对这个数组使用的指针访问数组前面或后面的任何内存。

      字符串的安全问题

    字符串相关的安全问题一般发生在越过字符串末尾写入的情况。

      指针算术运算和结构体

    只对数组使用指针算术运算,因为数组肯定分配在连续的内存块上,指针算术运算可以得到有效的偏移量。不过,不应该将它们用在结构体内,因为结构体的字段可能分配在不连续的内存区域。

      函数指针的问题

      内存释放问题

    重复释放

      

    清除敏感数据(在释放内存之前将敏感数据清空)

    小结:

  • 相关阅读:
    Python 操作Excel之通过xlutils实现在保留原格式的情况下追加写入数据
    【转载】Python字符串操作之字符串分割与组合
    【转】Python判断字符串是否为字母或者数字
    Appium 在测试android混合应用时,关于webview页面切换的那些事儿
    使用pip install XX 命令时报错
    Appium笔记(二) 丶Appium的安装
    Android SDK的下载与安装
    KlayGE 4.4中渲染的改进(五):OpenGL 4.4和OpenGLES 3
    最先进的开源游戏引擎KlayGE 4.4发布
    KlayGE 4.4中渲染的改进(四):SSSSS
  • 原文地址:https://www.cnblogs.com/iloverain/p/5625126.html
Copyright © 2011-2022 走看看