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

Posted 我永远信仰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了那为啥书上说str1必须足够长?相关的知识,希望对你有一定的参考价值。

今天遇到一个问题

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

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

来直接看结果

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

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

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


下面讲原理

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

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

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

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

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

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

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

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

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

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

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

你能回答了吗

以上是关于那为啥书上说str1必须足够长?的主要内容,如果未能解决你的问题,请参考以下文章

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

为啥说 NSString 的可变副本等于原始不可变副本?

为啥操作系统说内存足够时无法为jvm分配内存

C语言 数组的问题,书上的例子,说a = sizeof(mu) / sizeof(mu[0])可以统计数组的元素个数,为啥?

Spring Cloud - 熔断

有人可以向我解释为啥 L(长)必须在那里吗? [复制]