strcpy的有关问题

strcpy的问题
我有一个问题,如果目标字符数组比源字符数组短,会出现什么情况呢?
我自己写了一段程序
                  char   p[2];
char   p2[]= "ning ";
p[1]   =   '\0 ';  
strcpy(p,   p2);
cout   < <   p   < <   endl;
p比p2短,我觉得应该复制出界才对。更何况,我又加了   p[1]   =   '\0 ';
可运行的写果却是输出了 "ning ";
请问这是怎么回事啊?

------解决方案--------------------
在c中,编译器不检查是否出界的问题,全靠程序员自己掌握。所以如果你做这样的拷贝,你实际使用了你没有明确申请的内存。如果这段内存正好空闲,则你的操作不会发生什么错误。但如果这段内存存储了你的数据,则你原来的数据已经被覆盖。如果你使用的内存正好是关键内存,如系统使用的内存,则可能造成死机等各种错误。
------解决方案--------------------
顶楼上的。
------解决方案--------------------
顶楼上的楼上。
------解决方案--------------------
C和C++都不对数组作越界的检查,
像你上面那样写指针p一直在++,直到了没有申请的内存地区,也就是非法地区,
而你在输出的时候,cout < <p是一直输出到 '\0 '为止的,你前面原来有的 '\0 '已经被p2覆盖掉了,
所以p的结尾还是在ning的后面,所以可以一直输出整个完整的字符串.

但是,这样做是错的,当你回收p指向的这块内存时,系统会发现你占用了非法的内存,而内存出错.
但这只有在你delete的时候,或调用p[3]之类的时候,才会发生,单纯的cout是不发生错误的
------解决方案--------------------
for(int i=1;i <6;i++)
{
使劲顶(i);
}
------解决方案--------------------
for(int i=1;i <7;i++)
{
使劲顶(i);
}

------解决方案--------------------
for(int i=1;i <8;i++)
{
使劲顶(i);
}
------解决方案--------------------
for(;;)
{
使劲顶(i);
}

------解决方案--------------------
strcpy为了增加速度而不作边界检查,你可以看看代码

char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strSrc==NULL))
throw "Invalid argument(s) ";
char * strDestCopy=strDest;
while ((*strDest++=*strSrc++)!= '\0 ');
return strDestCopy;
}

是否安全全看使用者

------解决方案--------------------
说不清楚,麻烦,最好自己控制好,如果自己库函数的话倒可以用断言先判断下长度问题
------解决方案--------------------
编译器不检查指针越界,你让它怎么指它就怎么指,这样增加了指针的灵活性,但同时风险也很大,需要自己保证不出错误,要不后果可能会很严重。