Bin*_*eee 2 c string increment
我正在阅读这个网站的答案,其中说明以下内容未定义
char *fubar = "hello world";
*fubar++; // SQUARELY UNDEFINED BEHAVIOUR!
Run Code Online (Sandbox Code Playgroud)
但首先不是这样fubar++做,这意味着将指针移动到e,*()然后完成,这意味着提取e出来.我知道这应该是在聊天时问的(我是一个善良的人),但没有人在那里,所以我在这里要求吸引通知.
的位置++是关键:如果(在这种情况下等)的后缀,则增量发生后.
同样由于运算符优先级,您可以递增指针.
所以会发生什么是指针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)
显示的代码显然不是未定义的行为,因为*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)