我是靠谱客的博主 健壮灰狼,最近开发中收集的这篇文章主要介绍指针变动引起程序崩溃,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

《程序员面试宝典》上的第七章面试例题9:

       下列程序会在哪一行崩溃?

              structS {                                           //1

                     inti;                                                 //2

int *p;                                        //3

              };                                                     //4

              main()                                               //5

              {                                                      //6

                     S     s;                                        //7  

                     int*p =&s.i;                               //8

                     p[0]=4;                                      //9

                     p[1]=3;                                      //10

                     s.p=p;                                        //11

                     s.p[1]=1;                                    //12

                     s.p[0]=2;                                    //13

              }                                                      //14

 

答案是会在第13行崩溃。

程序从第8行开始看起,首先程序把s.i的地址给了p,即此时指针p指向机构s中的第一个元素i。

       第9行中,p[0]==*p==s.i。即在结构中i所在的地址内放入整形常量4。

       第10行中,p[1]==*(p+1)==p,即在结构s中p所在的地址上放入常量3。

       第11行,s.p=p,把p的地址放到s.p上,此时结构s中p所在的地址上放入的是一个指针p。由第9行知道指针p指向s结构中的i,即此时s.p内存放的是s.i的地址。

       第12行,s.p[1]==*(s.p+1),此时s.p为s.p内所存的值,即第11行赋值的p,也就是&s.i,则这句话实际上就是给以s.p命名的地址空间赋值为1.

       第13行,sp[0]==*sp,注意第12行中的程序更改了sp的值,也就是说现在的sp[0]和第13行中的sp[1]已经不是一个数列了(数列的头指针变化了),此时的s.p为1,即该程序相当于给地址0X0001空间赋值为2,对一个未做声明的地址直接进行访问当然会引发错误。

 

总结:在这道题上纠结了很长时间,最后想明白了,其实这是一道非常简单的题,读程序时要时刻分清指针指向的值和指针的值的关系。

最后

以上就是健壮灰狼为你收集整理的指针变动引起程序崩溃的全部内容,希望文章能够帮你解决指针变动引起程序崩溃所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部