strcpy目标数组长度不足也能复制进来?
char a;char b[]="abcdefghi";
strcpy(a,b);
printf("%s\n",a);
请问上面代码,a的长度不够,怎么b还能复制进来呢? 要理解这个问题,首先你得明白变量是如何分配内存空间的。
通常,高级语言在栈上面为临时变量分配内存空间,栈是一段内存,这段内存主要用于
函数调用时保存 寄存器 的值、传递参数、保存函数返回地址,同时也用于为临时变量分配内存空间。
同时,栈也可以看作一个数据结构,它的特性是后进先出。
函数调用的流程大概是这样的。
1、把参数入栈
2、把函数返回地址入栈
3、进入函数。
4、保存各寄存器的值
5、为临时变量分配内存
6、执行函数功能
7、释放临时变量内存
8、恢复各寄存器的值
9、函数返回
10、调整栈
因为临时变量是在栈上分配的,栈这段内存可读可写,并不被保护
所以,当你对临时变量操作的时候,超出变量长度的部分也是可以被写进去的。
但是,栈里面的其他数据就被破坏掉了。运气好的话,仅仅是破坏了其他变量的内容。
运气差的话,函数返回地址被改掉也是可能的,然后整个程序就乱套了。
所以strcpy是危险函数啊,缓冲区溢出的罪魁祸首之一。基本上都改用strncpy了
页:
[1]