#include<stdio.h>
int main()
{
char *s = "Abc";
while(*s)
printf("%c", *s++);
return 0;
}
我已经(在站点上)看到了正确的代码,但是我认为这是未定义的行为。我的理由:
这里
s
存储字符串文字Abc
的地址。因此,在遍历while循环时:在这里
*(s++)
将存储在s
中的地址递增1,并返回未递增的地址(即s
的先前/原始值)。因此,没问题,一切正常,并打印Abc
。现在,
s
指向一个完全不同的地址(可能有效或无效)。现在,当尝试执行while(*s)
时,它不是undefined behavior
吗?任何帮助将非常感激!
最佳答案
Iteration - 1:
Here
*(s++)
increments the address stored ins
by 1 and returns the non-incremented address (i.e the previous/original value ofs
). So, no problem everything works fine andAbc
is printed.
不,不打印“Abc”。
%c
告诉printf
期望一个字符值并打印出来。它只打印一个字符,而不是字符串。最初,s
指向"Abc"
的第一个字符。 s++
将其递增以指向下一个字符。Iteration - 2:
Now
s
points to a completely different address (which may be either valid or not). Now when trying to performwhile(*s)
isn't itundefined behavior
?
在迭代2中,
s
指向“b”。您可能已经在考虑某些
char **p
,而*p
已设置为指向"abc"
的指针。在那种情况下,增加p
会将其更改为指向不同的指针(或指向不受控制的内存),这将会出现问题。事实并非如此;对于char *s
,s
指向单个字符,并对其进行递增调整以指向下一个字符。
关于c - 这是未定义的行为(使用字符串文字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62984267/