c - 没有 '\0' 字符的字符串?

标签 c string

如果我错误地定义了一个没有 \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/

相关文章:

python - 有没有更好的方法来检查输入是否为数字?输入可以是 int 或 float

ruby - 用ruby字符串中的值替换变量,字符串本身存储在变量中?

Rcpp deparse等价物

c - 如何在 C LPWSTR 上进行字符串比较?

c - 共享内存错误 : shmat return NULL , errno(22 :Invalid argument) in CentOS6. 8

C中复制字符串

javascript - parse.com 云代码不接受 string.includes() 吗?

c++ - c\c++中套接字编程的问题

c - DSNAME 长度无效的 IBM Window Services (DWS) CSRIDAC

java - 在java中将大字符串拆分为最大长度的行