我正在从这个网站上读到一个答案,该答案是未定义的
char *fubar = "hello world";
*fubar++; // SQUARELY UNDEFINED BEHAVIOUR!
但不是首先完成fubar++
,这意味着将指针移至e
,然后完成*()
,这意味着将e
提取出来。我知道应该在聊天时问这个问题(我是一个好人),但没人在那儿,所以我想在这里引起注意。
答案 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