房天下 > 房天下问答 > 业主生活 > 其他
  • 指针数组:a[3][4]的a[i]赋值给*p[2]的p[i](i从0到2)

    大家好!若通过一个指针数组引用二维数组元素,书上说指针数组包含的元素个数须大于或等于a[3][4]的行数,即3。但试验时,用2甚至1,都能得出正确的运行结果。main(){int *p[2],a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11},i; for(i=0;i<3;i++)p[i]=a[i]; printf("%d,%d",p[0][1],p[2][3]);}运行结果是1,11请问到底是怎么回事呢?是不是侥幸的?但我试了好几种情况都运行正确了。可能对概念的理解还是不透彻,向各位请教,多谢!

    提问者:shoesbuyonline

    发布于2010-12-09

共1个回答
  • 茶的氤氲 丨Lv 4
    这是侥幸现象*p[2]只分配了2个4字节的内存单元,p[1]后面那些内存单元是干什么用的,我们就不知道了,你强行给p[2]赋值,计算机也没办法,只好按你的要求把数改上,然后你去访问,他也没办法,还得让你访问…… 这只是侥幸,因为别的程序没有使用这块儿内存,要是别的程序使用了呢?人家好好的运行着的程序,让你偷偷的把人家的变量给改了,那个程序是不会知道的,还照样去读数,结果……当然,windows是不会让这种错误产生的,程序只能访问自己的数据、代码、堆栈……一旦超出范围,你的程序就会被系统强制杀死,并显示“该程序遇到问题,需要被关闭,我们对给您造成的不便……”云云 你要是不信,就改改程序,加上i=0;for(;;i++){ p[i]=0; printf("%d\n",&i); }你看看系统能撑多久,不一会程序就会崩溃很多时候,就是这种漏洞,导致程序溢出,什么“执行任意代码”也就成为可能,被黑客利用……
    +1 2010-12-09 举报
热门人气推荐
免责声明:问答内容均来源于互联网用户,房天下对其内容不负责任,如有版权或其他问题可以联系房天下进行删除。