这个带有字符串文字的例子有什么问题?

Bin*_*eee 2 c string increment

我正在阅读这个网站的答案,其中说明以下内容未定义

char *fubar = "hello world";
*fubar++; // SQUARELY UNDEFINED BEHAVIOUR!
Run Code Online (Sandbox Code Playgroud)

但首先不是这样fubar++做,这意味着将指针移动到e,*()然后完成,这意味着提取e出来.我知道这应该是在聊天时问的(我是一个善良的人),但没有人在那里,所以我在这里要求吸引通知.

Som*_*ude 6

的位置++是关键:如果(在这种情况下等)的后缀,则增量发生.

同样由于运算符优先级,您可以递增指针.

所以会发生什么是指针fubar是取消引用(导致'h'然后被忽略),然后指针变量fubar递增以指向'e'.

简而言之:*fubar++很好,也很有效.

如果它是(*fubar)++那么它将是未定义的行为,从那时它将尝试增加字符串的第一个字符.C中的文字字符串是只读字符数组,因此尝试修改文字字符串中的字符将是未定义的行为.


表达式*fubar++基本上等于

char *temporary_variable = fubar;
fubar = fubar + 1;
*temporary_variable;  // the result of the whole expression
Run Code Online (Sandbox Code Playgroud)


Ste*_*ner 5

显示的代码显然不是未定义的行为,因为*fubar++它有点等于char result; (result = *fubar, fubar++, result),即它增加了指针,而不是取消引用的值,并且表达式的结果是*fubar指针增加之前的(解除引用)值.*fubar++实际上为您提供了fubar最初指向的字符值,但您只是不使用此"结果"并忽略它.

但请注意,以下代码确实 引入了未定义的行为:

char *fubar = "hello world";
(*fubar)++;
Run Code Online (Sandbox Code Playgroud)

这是因为这会增加fubar点的值,从而操纵字符串文字 - >未定义的行为.

用字符数组替换字符串文字时,一切都可以了:

int main() {

    char test[] = "hello world";
    char* fubar = test;
    (*fubar)++;
    printf("%s\n",fubar);
}
Run Code Online (Sandbox Code Playgroud)

输出:

iello world
Run Code Online (Sandbox Code Playgroud)