关于指针在使用的注意点说明 - 技术分享 - 志盟培训
首页技术分享 关于指针在使用的注意点说明

关于指针在使用的注意点说明

更新时间:2017-06-21      作者:齐老师       阅读:720

一、指针的声明与初始化

1、不恰当的指针声明

如下例所示:

int * ptr1, ptr2; //ptr1被声明为指针变量,ptr2为整型变量

正确示例如下:

int *ptr1, ptr2;


用类型定义代替宏定义比较合适。

宏定义辅助声明变量如下例所示:

#define PINT int*

PINT ptr1, ptr2;

这样同样会产生如上例中不恰当的结果,最好采用类型定义,如下例所示:

typedef int * PINT;

PINT ptr1, ptr2;


2、使用指针未初始化

在使用指针之前未初始化会导致运行时出错,如下例:

int * p;

printf(“%d\n”, *p);

未初始化的指针p可能会指向任何数据。


3、未初始化指针的处理

指针初始化时用NULL赋初值,易于检查且防止出错。如下所示:

int *pi = NULL;

...

if(pi == NULL){

//此处不宜使用pi

}

else{

//此处可以使用pi

}


二、指针的使用问题

缓冲区溢出:

缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区又被称为”堆栈”.。在各个操作进程之间,指令会被临时储存在”堆栈”当中,”堆栈”也会出现缓冲区溢出。

以下几种情况可能导致缓冲区的溢出:

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

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

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

误用strcpy和strcat这样的函数;


1、测试NULL

使用malloc函数时一定要检查返回值,否则可能会导致程序的非正常终止,如下正确处理所示:

float * p = malloc(20 * sizeof(float));

if(p == NULL){

//malloc分配内存失败

}else{

//处理p

}


2、错误使用解引操作

声明和初始化指针的常用方法如下:

int num;

int *pi = #

下面是一种看似等价但却是错误的声明方法:

int num;

int *pi;

*pi = #


3、越过数组边界访问内存

理论上程序是可以不受限制的访问数组分配空间以外的内存,但这样却会带来意外的错误,如下例所示:

#include<studio.h>

int main()

{

        char firstName[8] = “1234567”;

        char middleName[8] = “1234567”;

        char lastName[8] = “1234567”;

        middleName[-2] = ‘X’;

        middleName[0] = ‘X’;

        middleName[10] = ‘X’;

        printf(“%p %s\n”, firstName, firstName);

        printf(“%p %s\n”, middleName, middleName);

        printf(“%p %s\n”, lastName, lastName);

        return 0;

}

以上代码使用gcc编译或许不会报错,但在运行时会出现段错误,或者程序已放弃。

可知指针越过数组边界访问了数组以外的内存,结果导致该区域的数据被修改,这样的错误是需要极力避免的。


4、错误使用sizeof操作符

下例是试图检查指针边界但方法错误:

#include<stdo.h>

int main()

{

        Int buffer[20];

        Int *pbuffer = buffer;

        for(int i = 0; i < sizeof(buffer); i++)

        {

                 *(pbuffer++) = 0;

        }

        return 0;

}

下划线错误之处应当改为:i<sizeof(buffer)/sizeof(int);

在线报名

志盟科技上海招聘

在线报名 联系我们

志盟科技深圳招聘

在线报名 联系我们

志盟科技北京招聘

在线报名 联系我们
联系我们

咨询热线:

咨询 QQ:517578         

就业学员

  • 就业学员

    姓名:郭凡凡 
    院校:阜阳师范学院
    就职:佳戴
    职位:软件工程师
    月薪:10000

  • 就业学员

    姓名:陈祥龙 
    院校:中北大学
    就职:美囤妈妈
    职位:软件工程师
    月薪:9000

  • 就业学员

    姓名:陈建伟
    院校:南昌航空大学
    就职:SONY
    职位:嵌入式工程师
    月薪:8000

×
×
  • *真实姓名
  • *联系手机
  • *上课地址
  •    QQ号码

温馨提示:请保持手机畅通,咨询老师将为您提供专属的一对一报名服务。

×
  • *真实姓名
  • *联系手机
  • *联系邮箱
  • * QQ号码

温馨提示:请保持手机畅通,咨询老师将为您提供专属的一对一的服务。

本站由 宽敬科技——创新企业的建站运营顾问 提供支持