如果我错误地定义了一个没有 \0
作为它的最后一个字符的 char 数组,那么会发生什么?
我问这个是因为我注意到如果我尝试使用 while(cnt!='\0')
遍历数组,其中 cnt
是一个int 变量用作数组的索引,同时打印 cnt 值以监视发生的事情迭代在最后一个字符 +2 处停止。额外的字符当然是随机的,但我不明白为什么它必须在之后停止2.编译器会自动插入\0
字符吗?相关文档的链接将不胜感激。
为了清楚起见,我举个例子。假设数组 str
包含单词 doh
(没有“\0”)。在每个循环中打印 cnt 变量会给我这个:
doh+
或者 doh^
等等。
最佳答案
编辑(未定义的行为)
访问数组边界之外的数组元素是未定义的行为。
使用 C 字符串以外的任何内容调用字符串函数是未定义的行为。
不要这样做!
C 字符串是由并包括 '\0'
(NUL 终止符)终止的字节序列。所有字节必须属于同一个对象。
总之,你看到的都是巧合!
但它可能会像这样发生
,------------------ garbage | ,---------------- str[cnt] (when cnt == 4, no bounds-checking) memory ----> [...|d|o|h|*|0|0|0|4|...] | | \_____/ -------- cnt (big-endian, properly 4-byte aligned) \___/ ------------------ str
关于c - 没有 '\0' 字符的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5290823/