我正在从此网站阅读答案,该答案未定义
char *fubar = "hello world";
*fubar++; // SQUARELY UNDEFINED BEHAVIOUR!
但不是首先完成
fubar++
,这意味着将指针移动到e
,然后完成*()
,这意味着将e
提取出来。我知道应该在聊天时问这个问题(我是一个好人),但是没人在那儿,所以我想在这里引起注意。 最佳答案
所显示的代码显然不是不确定的行为,因为*fubar++
在某种程度上等于char result; (result = *fubar, fubar++, result)
,即它增加了指针而不是取消引用的值,并且表达式的结果是在指针增加之前的(取消引用的)*fubar
值。 *fubar++
实际上为您提供了fubar
最初指向的字符值,但是您只是不使用此“结果”而忽略它。
但是请注意,以下代码确实引入了未定义的行为:
char *fubar = "hello world";
(*fubar)++;
这是因为这会增加
fubar
指向的值,从而操纵字符串文字-> undefined behaviour。当用字符数组替换字符串文字时,一切都再次正常:
int main() {
char test[] = "hello world";
char* fubar = test;
(*fubar)++;
printf("%s\n",fubar);
}
输出:
iello world