标签:
本文测试指针初始化的方式:
错误初始化方式一:
int* p = NULL;//此句等于p = NULL;将指针指向了NULL这个地址,(NULL=0x0)
*p = 0x10;//试图访问0x0内存,被拒绝
错误初始化方式二:
int* p;//定义的时候未进行初始化,此时指针指向一块未知的内存
*p = 0x10;//试图访问未知内存,被拒绝
那么指针到底如何初始化?
初始化方式参考一:
首先定义一个相应类型的变量,我们称之为指针初始化变量,它的作用
就是用来进行指针初始化的,或者程序中可以对它进行其他的利用。
int pinit = 0;
int* p = &pinit;//初始化指针,这个时候p指针就指向了变量pinit的内存地址
是一块合法的地址
初始化方式参考二:
在参考方式一中,首先定义了一个整型变量,那么我们可以事先获取它的地址
&pinit 我在Code::Blocks上测试的地址是0x22ff18
int* p = (int*)0x22ff18;//当然,这个地址绝对是合法地址,针对不同的编译器,
//我建议多预留几个字节也可以
*p = 0x10;//便可冠冕堂皇地访问该内存
这样就省去了一个整型变量的定义,有一种很高端的感觉,有木有?
初始化方式参考三:
int* p = NULL;//其实这个初始化方式不能说错,但是我们要警惕自己写出这样的代码
如果不小心会发生什么意外状况,你得清楚这块内存是不可访问的(赋值),但是,可以用
指针来指向它,正如你看到一条项链,你用手指指着它了,但是你不能去买。
在上述初始化后,在以后的程序里,在你要使用这个指针之前,先做一下检测:
if(NULL==p)
{
p = &var1//var1:一个拥有合法地址的你想去访问的变量,这样就能使得p指向一个合法地址了
}
else
{
p = &var2//var2:一个拥有合法地址的你想去访问的变量,这样就能使得p指向一个合法地址了
}
另外一种的检测方式:
assert(NULL!=p);//也就是断言,如果NULL!=p(条件为真)程序就会继续运行,否则(条件为假)终止运行。
这样,如果断言发挥了做用,我们就知道错误出现在哪里了,可以及时的修正bug。
总结:最终还是得让指针指向一块合法的可以访问的内存。
标签:
原文地址:http://blog.csdn.net/oimchuan/article/details/43924259