c语言的strcpy()?

想要使用strcpy()把字符数组a赋值给b,有点疑问:

char a[]="abcdef";
char b[]="666";
strcpy(b,a);

然后程序正常执行。
我认为:从道理上讲b的长度是不够的,也就是说其实程序使用了数组b目前地址的后几个才存放的多余数字。因为这部分内存暂时没用所以输出正常。
请问我的理解对不对?如果不对,那事实是怎样的?如果对,我要如何修改代码使结果安全,在不使用其他数据结构(比如vector)的基础上。
先谢谢大家了。

阅读 4.1k
2 个回答

不会自动增加目标字符串的长度;
著名的黑客攻击手段--缓冲区溢出,就是根据这个特点产生的。
当调用strcpy(),strcat(),gets(),fgets()...而传入一段过长的串时,如果程序员未检查源字符串的长度。就会导致紧跟在目标字符串后面的内存被覆盖,如果该内存记录的是函数的返回地址,那么当函数该返回时,程序就会试图跳到该地址内容(为一指针值)所指的地方继续执行。从而造成安全漏洞。
解决方法:
尽量使用这些函数对应的安全类型函数。
如:strncpy(),strncat()..

遇到这类问题可以先自己查查

这种将长字符串赋值给短字符串是不允许的,会造成内存溢出,访问不该访问的地方,造成无法预料的结果。但是,C库的strcpy()调用实际上不会检查Null结束字符串的长度是否溢出。g++编译器的内部处理
如果你考虑到vector的话,就已经是C++的范畴了。在C++中,你可以使用标准库中的string模板类进行方便的字符串操作,既保证了与C语言Null结束字符串的兼容,有保证了溢出等不安全代码的发现,非常推荐。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏