首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >总结了一些指针易出错的常见问题(六)

总结了一些指针易出错的常见问题(六)

作者头像
互联网金融打杂
发布2018-04-03 12:19:34
7190
发布2018-04-03 12:19:34
举报

  安全问题与指针误用

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

误用指针

释放问题

指针声明:

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

#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\n",*p1,*p2,*p3);
printf("a=%d b=%d c=%d\n",a,b,c);

 p1=&c;
*p2=9;
*p3=10;
printf("%d %d %d\n",*p1,*p2,*p3);
printf("a=%d b=%d c=%d\n",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\n", name);
    printf("%d\n", 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\n", sizeof(name));
} 

  一定要匹配指针类型

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

  有界指针

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

  字符串的安全问题

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

  指针算术运算和结构体

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

  函数指针的问题

  内存释放问题

重复释放

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

小结:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-06-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档