我正在从此网站阅读答案,该答案未定义

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

08-19 06:17