#include <iostream>
using namespace std;
const int BUFSIZE = 1 << 20;
char padded_buffer[64 + BUFSIZE + 64];
char* buffer = padded_buffer + 64;
int main()
{
buffer[-1] = '?';
// is that always equivalent to padded_buffer[63] = '?' ?
cout << padded_buffer[63] << "\n";
return 0;
}
我有一段像上面这样的代码。基本上,由于某些原因,我需要“隔离”阵列的两侧。
但我想知道上面的语法是否安全?我知道负索引通常是未定义的行为,但是这种情况又如何呢?
From https://eel.is/c++draft/expr.sub#2:
表达方式E1[E2]
与(根据定义)相同*((E1)+(E2))
,但在数组操作数的情况下,如果该操作数是左值,则结果是左值,否则结果是x值。
只要您仅到达指向同一数组中元素的指针,就可以定义指针算术。
不存在未定义的行为。buffer[-1]
只是*(padded_buffer + 64 -1)
.
这在某种程度上是基于意见的,但是buffer[-1]
看起来很奇怪。恕我直言,它混淆了这样一个事实:buffer
不是数组,而是指向实际数组中间元素的指针。如果你想给数组的第 63 个元素赋值padded_buffer
然后就这样做:padded_buffer[63] = '?';
.
在评论中,我建议将数组包装在具有重载的自定义类型中operator[]
,但这并不能解决看起来怪异的问题x[-1]
。也许我宁愿让索引转换在调用代码中直接可见,以便padded_array[ transform_index(-1) ]
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)