首页 > C > 指针 阅读:57,774

指针使用注意事项

分析完指针的一些典型问题之后,现在将使用指针的一些需要注意的问题总结如下:

1)指针在声明的时候最好初始化。

指针变量没有被初始化,任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会随机的指向任何一个地址(即野指针),访问野指针会造成不可预知的后果。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。

2)指针的加减运算移动的是指针所指类型大小。

前面已经提到,指针的加法运算p = p + n中,p向前移动的位置不是n个字节,而是n * sizeof(*p)个字节,指针的减法运算与此类似。

3)当用mallocnew为指针分配内存时应该判断内存分配是否成功,并对新分配的内存进行初始化。

mallocnew分配内存,应该判断内存是否分配成功。如果失败,会返回NULL,那么就要防止使用NULL指针。在分配成功时,会返回内存的地址。这个时候内存是一段未被初始化的空间,里面存在的可能是垃圾数据。因此,需要用memset等对该段内存进行初始化。

此外,应该防止试图使用指针作为参数,去分配一块动态内存。如果非要这么做,那么请传递指针的指针或指针的引用。

4)如果指针指向的是一块动态分配的内存,那么指针在使用完后需要释放内存,做到谁分配谁释放的原则,防止内存泄漏。

此点笔者会在第9章内存分配中进行专门的介绍,详情请参考内存泄漏预防与检测

5)指针在指向的动态内存释放后应该重新置为NULL,防止野指针。

野指针不是NULL指针,是指向“垃圾”内存的指针。野指针是很危险的,它可能会造成不该访问的数据或不该改的数据被访问或者篡改。在应用free或者delete释放了指针指向的内存之后,应该将指针重新初始化为NULL。这样可以防止野指针。

野指针不是NULL指针,是指向“垃圾”内存的指针。野指针是很危险的,它可能会造成不该访问的数据或不该改的数据被访问或者篡改。在应用free或者delete释放了指针指向的内存之后,应该将指针重新初始化为NULL。这样可以防止野指针。

分析下面的程序:

 

void GetMemory(char **p,int num)

{

    *p=(char *)malloc(num);

}

int main(void)

{

    char *str=NULL;

  

    GetMemory(&str,100);

    strcpy(str,"hello");

    free(str);

 

    if(str!=NULL)

    {

        strcpy(str,"world");

    }  

    printf("\n str is %s",str);

    getchar();

}

 

分析:上面的代码经常出现在各大外企的笔试题目里,它通过指针的指针分配了一段内存,然后将”hello”拷贝到该内存。使用完后再释放掉。到此为止,代码没有任何问题。但是,在释放之后,程序又试图去使用str指针。那么这里就存在问题了。由于str没有被重新置为NULL,它的值依然指向了该内存。因此后面的程序依然能够打印出”world” 字符串。

 

所以,应该在free(str)后,再加上下面一行代码:

str=NULL;

 

6)指针操作不要超出变量的作用范围,防止野指针。

分析下面的代码:

 

char *func()

{

     char c = ‘A’;

     char *p = &c;

     return p;

}

void main(void)

{

     char * pc = NULL;

 

     p = func();

     printf(“%c”, *p);

}

 

在上面的代码中,func()函数试图返回一个指向局部变量c的指针。然而局部变量的生命期为func()函数执行期,即变量c分配在栈上,func()函数执行完后,c就不存在了。返回的指针就是一个无效的野指针。因此,打印*p时,可能会出现任何一个不可确定的字符。

周哥教IT,分享编程知识,提高编程技能,程序员的充电站。跟着周哥一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

当你决定关注「周哥教IT」,你已然超越了90%的程序员!

IT黄埔-周哥教IT技术交流QQ群:213774841,期待您的加入!

二维码
微信扫描二维码关注