此问题在此处已有答案:
What's the rationale for null terminated strings?(20个答案)
15天前关闭。
我是C的新手,最近遇到了这个问题。
我有两段代码:
第一个
当我添加变量y时,到底发生了什么,它改变了结果?
此问题在此处已有答案:
What's the rationale for null terminated strings?(20个答案)
15天前关闭。
我是C的新手,最近遇到了这个问题。
我有两段代码:
第一个
当我添加变量y时,到底发生了什么,它改变了结果?
3条答案
按热度按时间cmssoen21#
正如其他人所说,您不能在单个字符上使用strlen,因为不能保证空终止符。
在第一种情况下,您很幸运,在堆栈Map中,'a'后面跟着一个空字节。
在第二种情况下,可能是由于变量y的定义,“a”后面跟着六个非零字节,然后是一个空。
请注意,这只是一个假设。调试或发布版本的行为可能不同。这种不稳定的现象是不希望的内存访问的典型现象。
tf7tbtn22#
strlen()
需要字符串作为其参数。C中的字符串是以空字符结尾的char
序列。您的变量
x
只是一个没有以空字符结尾的字符。它不是strlen()
的有效参数。因此,该行为是危险的且未定义的。62lalag43#
代码触发未定义的行为。
我们不可能很好地解释它,因为无论发生什么,它 * 很可能 * 会把单字符变量当作一个字符串,然后读取下一个字节来寻找终止符。
因为这个字节实际上并不在一个有效的变量中,所以这个行为是未定义的,任何事情都有可能发生。