首页 > 解决方案 > 这个字符串文字的例子有什么问题?

问题描述

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

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

但不是fubar++先完成,这意味着将指针移动到e*()然后完成,这意味着提取e出来。我知道这应该在聊天中被问到(我是一个善良的人),但没有人在那里,所以我在这里问是为了引起注意。

标签: cstringincrement

解决方案


的位置++是关键:如果它是一个后缀(就像在这种情况下),那么增量发生.

同样由于运算符优先级,您增加了指针

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

简而言之:*fubar++很好并且有效。

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


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

char *temporary_variable = fubar;
fubar = fubar + 1;
*temporary_variable;  // the result of the whole expression

推荐阅读