c - 这个字符串文字的例子有什么问题?
问题描述
我正在阅读该网站的答案,其中说以下内容未定义
char *fubar = "hello world";
*fubar++; // SQUARELY UNDEFINED BEHAVIOUR!
但不是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
推荐阅读
- javascript - 带有扩展名和文件大小的 JavaScript 文件类型
- c++ - 伪造真 ↔ 假
- javascript - Laravel npm run watch 不能在运行时 scss 和 js 中编译
- javascript - 如何在站点重新启动或单击按钮后激活选择值
- python - 如何从 Conda 中删除环境
- sql-server - 从现有查询中使用 SqlKata
- android - 如何在不摇动物理设备的情况下激活 React Native 上的调试?
- javascript - 错误:凭据参数需要实现signRequest 方法?
- c# - 当第一个触发器忙时,石英触发器会堆积
- c - STM32 F407VG 启动到不同的(主)应用程序