其他的话暂时不说,以后再有总结。
这是我在实际操作中所遇到的问题,可能对很多高手或是基础好的人来说,不会犯这些错误,但是对于我们这些初级菜鸟来说,很容易走进这个陷阱来。造成系统崩溃却又难于找到原因的情况:不正当使用了指针
下面是我在实际操作中遇到的问题,这个问题让我迷茫了好一阵子,今天,静下心来去仔细查阅了这些资料,终于将问题给解决了,兴奋了一会,同时也对指针有了进一步的了解。
过路的大侠勿笑,请飘过~~~~
问 题 :
系统莫名其妙地死机
情况描述:
能正常编译与运行,但不稳定,没几下就将系统给弄死机了。死机时,指向的是一个保存错误中断的寄存器。
请 教:
同事说遇到这个问题有两种情况,一种是硬件出错,一种是指针使用不正确,能够运行说明硬件是没问题的,应该是你的指针出了问题。
跟踪调试:
锁定位置,可是依然没有办法解决。但是在调试的过程中,却发现了一个很重要的现象,指针的内容怎么实然给更改了,是谁更改了里面的内容?
疑 问:
指针出问题?我在声明的时候已经将所有的都初始化了,有些也态度申请了空间,并做出了判断,如果有一个没有申请成功的就会释放之前申请成功的空间,并返回。没有申请空间的,都如此初始化:char *p=NULL;为了防止野指针的出现。(在优快云论坛上有指针初始化的讨论,所有的人都这样初始化是不恰当的,他们认为应该这样初始化:char *p=new char[10];但我认为这种方法是要开销内存的)
http://topic.youkuaiyun.com/t/20030227/16/1473814.html
理解指针:
什么是指针呢?指针有什么作用呢?里面保存了些什么东西?
1,指针是一个占用4个字节的变量,可以用 sizeof(p)来查看其占有的空间,暂时得到一个结论是不管什么类型的指针都是占据4个字节空间。
2,指针的作用是指向变量的地址,通过变量的地址访问相应的值。
3,指针本身也有一个地址,叫做指针地址,占据一定的内存空间,如上面1所说,但是这些不是这个问题关心的事,关心的是,指针里面到底保存了些什么东西,保存的是变量地址,也叫做指针的值。要想得到指针的地址、指针的值、指针的值所指的内容(指针所指对象的内容),可以通过以下方法获得:
char *p=NULL;//初始化指针的值,使其为0,防止野指针出现,
int i=10;
p=&i;//获得i的地址,其地址指向的值是10
printf("指针本身的地址:%x\n",&p);
printf("指针的值:%x\n",p); //在此也就是i的地址
printf("指针的值所指的内容:%x\n",*p);//指针所指对象的内容,这里是10
使用指针所在遵循一个法则,先找到地址(指的是:指针的值),后才能对相应的值操作。
我们常说不能向空指针写数据,也就是不能向0地址写数据,但是为什么上面的定义又不会错呢?char *p=NULL;不就是一个空指针么?是的,这个是空指针,它的值为0,我们当然不能这样操作:
char *p=NULL;
p=5;//此时指针还没有获得有效的值,其地址为0,所以不能向0地址写数据。
但是可以这样操作:
char *p=NULL;
int i=10;
p=&i;
printf("i的值:%d",*p);//打印出来的是10
p=5;//此时p已经获得了i的地址,指针p的值就是i的地址,我们可以通过地址来对i进行操作了
printf("i的值:%d",*p);//打印出来的是5
解决问题:
虽然我已经知道这是我的指针造成系统崩溃,但是找不到是哪个指针出了问题,因为我已经尽有可能的将“野孩子”(野指针)给扼杀了。
不知道今天是不是人品突然暴发,竟然在调试的时候又让我发现了问题的根源,我只是将传过来的指针参数简单地赋给了一已经动态申请到空间的新指针:
void(char p)
{
char *new_p=(char *)malloc(256);
if(new_p==NULL)
return;
new_p=p;//此处没有将p的所有值写到new_p的空间里面
dosomething();
}
这样的赋值,并没有将p的所有值写到new_p的空间里面,到下面一使用new_p的时候就会出现乱值。
后来改为:
void(char p)
{
char *new_p=(char *)malloc(256);
if(new_p==NULL)
return;
// new_p=p;//此处没有将p的所有值写到new_p的空间里面
memcpy(new_p,p,strlen(p));
dosomething();
}
运行后,系统经得起考验,哈哈,解决问题
总结心得:
1,定义指针时,养成初始化指针的习惯,我们可以初始化为0,防止出现野指针。
2,使用char *p=NULL这样的空指针时,必须先给指针p一个有效的地址空间,然后才可以对其进行操作,也就是这样的动作必须配对使用:
char *p=NULL;
p=&a; //a是一个确定的参数,
使用指针操作时必有先初始化。否则容易出现莫名其妙的问题。
使用指针所在遵循一个法则,先找到地址(指的是:指针的值),后才能对相应的值操作。