为什么strlen()在C中会产生不同的输出,但我一直没有改变参数?[duplicate]

6l7fqoea  于 2022-12-03  发布在  其他
关注(0)|答案(3)|浏览(139)

此问题在此处已有答案

What's the rationale for null terminated strings?(20个答案)
15天前关闭。
我是C的新手,最近遇到了这个问题。
我有两段代码:
第一个
当我添加变量y时,到底发生了什么,它改变了结果?

cmssoen2

cmssoen21#

正如其他人所说,您不能在单个字符上使用strlen,因为不能保证空终止符。
在第一种情况下,您很幸运,在堆栈Map中,'a'后面跟着一个空字节。
在第二种情况下,可能是由于变量y的定义,“a”后面跟着六个非零字节,然后是一个空。
请注意,这只是一个假设。调试或发布版本的行为可能不同。这种不稳定的现象是不希望的内存访问的典型现象。

tf7tbtn2

tf7tbtn22#

strlen()需要字符串作为其参数。C中的字符串是以空字符结尾的char序列。
您的变量x只是一个没有以空字符结尾的字符。它不是strlen()的有效参数。因此,该行为是危险的且未定义的。

62lalag4

62lalag43#

代码触发未定义的行为。
我们不可能很好地解释它,因为无论发生什么,它 * 很可能 * 会把单字符变量当作一个字符串,然后读取下一个字节来寻找终止符。
因为这个字节实际上并不在一个有效的变量中,所以这个行为是未定义的,任何事情都有可能发生。

相关问题