【发布时间】:2019-06-07 02:12:01
【问题描述】:
我收到的是警告,而不是错误,当我忽略警告并无论如何构建/运行时,我的代码似乎工作得很好。不过,我仍然担心,因为警告,或者我只是想了解它。
此函数将单个字符附加到字符串的开头。
void s_pfx(char pf, char *s){
i = -1;
while(s[++i]);
s[i + 1] = '\0';
while(i)
s[i] = s[--i];
s[i] = pf;
}
当我预先递减 i 时,警告出现在 while 循环中。 (我将 i 作为全局变量。)
警告是“警告:对'i'的操作可能未定义[-Wsequence-point]”
我可以通过使用来修复它
while(i){
s[i] = s[i - 1];
i--;
}
但是为什么我必须这样做呢?看起来这会消耗时间,也许是纳秒,但它会加起来。
我不明白为什么编译器无法理解代码。这对我来说似乎定义得很清楚。我查看了其他一些类似的问题/答案,但这似乎要简单得多。
帮助!谢谢。
【问题讨论】:
-
这就是你不会像那样滥用递增和递减运算符的原因之一。它不仅难以阅读,而且有时会出现未定义的行为,就像这种情况一样。
-
关于:
while(s[++i]); s[i + 1] = '\0';您的问题中没有任何内容表明保存传入参数 's[]' 的缓冲区(至少)比包含的字符串长一个字节。所以这可能会超过输入缓冲区的末尾 -
@user3629249,是的,我一直在关注这一点。我的字符串都是 malloc'd 到 100,当我需要提高它时,我会通过我的输出知道。谢谢。
标签: c codeblocks