gpt4 book ai didi

c++ - 我可以保证以负偏移访问指针吗?

转载 作者:行者123 更新时间:2023-11-30 01:06:52 25 4
gpt4 key购买 nike

我在正在调试的嵌入式代码中发现了负索引访问:

for (int i = len; i > 0; i--)
{
data[i - 1] = data[i - 2]; // negative access when i == 1
}

我读了this关于类似的情况,但在 OP arr[-2] 中保证是好的,因为 arr 指向先前分配的数组的中间。在我的例子中,data 是类中的一个指针,由构造函数初始化:

public:
constructor_name(): ... data(new T_a[size]), ...

指针data是类中的第一个成员:

template <class T_a, class T_b, int size>
class T_c
{
private:
T_a *data;
T_b *...;
int ...;
int ...;
int ...;

public:
constructor_name(): ... data(new T_a[size]), ...

现在,负索引访问是否有可能是故意的并且有意义?编写程序的程序员是否有办法使用 #pragma pack () 或其他任何方法确保 data[-1] 将访问特定数据?

看到 *data 是类(class)中的第一个成员让我认为这是一个错误,但我不确定。如果它确实是一个错误 - 是 UB 吗?

最佳答案

你问的是保证(一个相当强硬的词)。你的代码有 undefined behavior (因为你正在访问你的对象之外的一些数据)这真的意味着你不能有任何保证。乱七八糟的东西could发生,即使在实践中它们通常不会发生(特别是当 data 指向标量类型时,如指针)。

我建议将 for (int i = len; i > 0; i--) 替换为 for (int i = len; i > 1; i--) 至少让代码更易读,更符合标准。

如果出于某种奇怪的原因,data[-1] 访问对以前的程序员有意义,他至少应该对此发表评论。我想如果他不这样做,那只是一个错误。

关于c++ - 我可以保证以负偏移访问指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45475290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com