那为啥书上说str1必须足够长?

当strcat函数用于连接两个字符串时,如果str1的长度不足以容纳str2,程序可能会导致内存溢出,覆盖相邻内存区域。虽然在某些情况下可以成功连接,但这是一种潜在的BUG,因为可能会破坏其他数据或触发不可预知的行为。str1必须足够长以避免这种问题,否则可能导致数据丢失或系统崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到一个问题

strcat(str1,str2)中:如果str1不够长的话,会怎样?(是不是只会连接一部分str2的内容啊?)

答案是:如果str1不够长,那么该程序会出现bug

来直接看结果

可见,虽然给str1申请的长度小于str1+str2的长度,不过仍然是可以连接上的

尽管多运行几次,答案仍然是一样

这是可以运行,并且能拿到预期的结果,只不过程序有可能会出现bug


下面讲原理

此时我们给str1和str2申请的长度都是20,申请的空间是占用内存的,就大概是这样

strcat 函数复制,是通过指针将第二个参数字符串中的字符一个一个地复制到第一个参数的字符串尾部后面。

在内存中,计算机并不会独立开辟固定大小的内存给我们使用,而只是进行划分。

image-20211210215615714

函数根本就不知道这两个参数所指的内存空间实际到底有多大,也就是说函数不会因为这两个数组不够大而主动给你报错(内存一般是足够大的 ,也就是后面一般会连着未被申请的内存)。它只会依次复制字符,先把剩余未使用的填满,然后一直写,就算写过界也不知道。

image-20211210220006344

这可能不会引起问题,但会有这些情况:

(因为后面的空间是未知的)

  • 如果后面的内存是不可写入的,那么会报错

  • 如果后面的内存已经存放了有用的数据,会被覆盖掉,造成数据丢失

    比如:刚好有个 char ch='z' ;是存放在他后面的空间,而ch的值因为被str2覆盖了.那么ch的值是不准确的。

    image-20211210221240712

因为内存是操作系统随机分配的,上面说的情况不一定会发生,但这一定是一个BUG!

那为啥书上说str1必须足够长?

你能回答了吗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值