【发布时间】:2021-06-12 08:00:13
【问题描述】:
我知道C中的空终止符用\0表示,数值为0。但是,当我执行下面的代码时,程序将空终止符视为%。我在网上搜索了这个,但我找不到有这个问题的人。
int main(){
char* forward = "hello";
int forward_length = 0;
while (*(forward++) != '\0') {
printf("%d\n", forward_length++);
}
if(*forward == '%'){
printf("Terminator Found");
}
}
输出是:
0
1
2
3
4
Terminator Found
显然,forward[5] 不等于字符 %。有人可以告诉我程序有什么问题吗?
【问题讨论】:
-
while (*(forward++) != '\0')无论条件如何,这都会增加forward。当循环结束时,forward将指向'\0'nul 终止符之后的一个,而取消引用*forward是UB。 -
写代码的人可能希望
"%d"字符串在内存中紧跟"hello",但没有这样的保证;代码依赖于未定义的行为。 -
您对
(*forward == '%')的测试正在寻找一个超过空终止符,因为早期的空检查后增加了它。所以它相当于在原始字符串中使用索引 6,而不是 5。由于您正在索引字符串常量的空终止符,因此它是未定义的行为,并且值可以是任何值。
标签: c null-terminated