字符串文字的示例有什么问题?

时间:2018-11-21 09:47:17

标签: c string increment

我正在从这个网站上读到一个答案,该答案是未定义的

char *fubar = "hello world";
*fubar++; // SQUARELY UNDEFINED BEHAVIOUR!

但不是首先完成fubar++,这意味着将指针移至e,然后完成*(),这意味着将e提取出来。我知道应该在聊天时问这个问题(我是一个好人),但没人在那儿,所以我想在这里引起注意。

2 个答案:

答案 0 :(得分:6)

++的位置是关键:如果是后缀(如本例所示),则增量发生在之后

也由于operator precedence,您增加了指针

所以发生的事情是指针fubar被取消引用(导致'h',然后被忽略),然后指针变量fubar递增以指向{{1 }}。

简而言之:'e'很好并且有效。

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


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

*fubar++

答案 1 :(得分:5)

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

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

char *fubar = "hello world";
(*fubar)++;

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

当用字符数组替换字符串文字时,一切都很好:

int main() {

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

输出:

iello world