鱼C论坛

 找回密码
 立即注册
查看: 1606|回复: 2

strcpy目标数组长度不足也能复制进来?

[复制链接]
发表于 2021-1-30 13:21:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
char a[3];
        char b[]="abcdefghi";
        strcpy(a,b);
        printf("%s\n",a);

请问上面代码,a的长度不够,怎么b还能复制进来呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-30 14:07:39 | 显示全部楼层
要理解这个问题,首先你得明白变量是如何分配内存空间的。
通常,高级语言在栈上面为临时变量分配内存空间,栈是一段内存,这段内存主要用于
函数调用时保存 寄存器 的值、传递参数、保存函数返回地址,同时也用于为临时变量分配内存空间。
同时,栈也可以看作一个数据结构,它的特性是后进先出。
函数调用的流程大概是这样的。

1、把参数入栈
2、把函数返回地址入栈
3、进入函数。
4、保存各寄存器的值
5、为临时变量分配内存
6、执行函数功能
7、释放临时变量内存
8、恢复各寄存器的值
9、函数返回
10、调整栈

因为临时变量是在栈上分配的,栈这段内存可读可写,并不被保护
所以,当你对临时变量操作的时候,超出变量长度的部分也是可以被写进去的。
但是,栈里面的其他数据就被破坏掉了。运气好的话,仅仅是破坏了其他变量的内容。
运气差的话,函数返回地址被改掉也是可能的,然后整个程序就乱套了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-1 16:23:55 | 显示全部楼层
所以strcpy是危险函数啊,缓冲区溢出的罪魁祸首之一。基本上都改用strncpy了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 04:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表