从后往前逐个赋值字符串字符的C++代码是否合法?
这段C++代码是合法的
当前给出的代码完全符合C++标准,不存在未定义行为,具体分析如下:
- 调用
b.resize(a.length())后,b的长度被设置为和a一致,此时b拥有合法的内存空间,所有索引0到b.length()-1的位置都可以通过[]安全访问(std::string的operator[]对于合法索引无边界检查,但只要索引在[0, size())范围内就是标准允许的操作)。 - 循环中的索引计算完全合法:
b[times-1]:times从a.length()递减到1,对应的索引从b.length()-1到0,全部在b的有效索引范围内。a[b.length()-times]:因为b.length()等于a.length(),当times取n, n-1,...,1时,这个表达式的结果是0,1,...,n-1,正好覆盖a的所有有效索引,不会越界。
至于你之前遇到的段错误,大概率是当时的代码和当前版本不一致导致的,比如:
- 没有调用
b.resize()就直接通过[]给b赋值,此时b为空,访问任何索引都会触发越界访问,引发段错误。 - 索引计算逻辑有误,比如错误写出了超出
a或b长度范围的索引值。
内容的提问来源于stack exchange,提问作者Synthwave09
相关产品推荐
相关产品推荐

