0$房天下问答|指针数组:a[3][4]的a[i]赋值给*p[2]的p[i](i从0到2)$https://m.fang.com/ask/ask_1403863.html$https://static.soufunimg.com/common_m/m_public/201511/images/asksharedefault.png
packc/pages/ask/detail/detail?askid=1403863
-
指针数组: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); }你看看系统能撑多久,不一会程序就会崩溃很多时候,就是这种漏洞,导致程序溢出,什么“执行任意代码”也就成为可能,被黑客利用……
免责声明:问答内容均来源于互联网用户,房天下对其内容不负责任,如有版权或其他问题可以联系房天下进行删除。

关注成功