【发布时间】:2019-01-31 17:15:52
【问题描述】:
所以这是我昨天提出并得到回答的问题的第 2 部分。所以今天我带着第 2 部分回来。我不确定这是否应该在其他地方,所以如果版主想要移动它,请随意。
所以我不打算在这里重新介绍我的问题,所以请阅读第 1 部分 Iterating through a vector of stucts's members with pointers and offsets
所以我想出了一个解决问题的方法,所以让我发布一个修改后的 sn-p 代码,代表我想要的解决方案,
#include <iostream>
#include <vector>
// knows nothing about foo
class Readfoo
{
private:
int offSetSize;
char* pchar;
public:
void SetPoint(double* apstartDouble, int aoffSetSize)
{
offSetSize = aoffSetSize;
pchar = static_cast<char*> (static_cast<void*>(apstartDouble));
};
const double& printfoo(int aioffset) const
{
return *(static_cast<double*> (static_cast<void*>(pchar + aioffset*offSetSize)));
};
};
// knows nothing about readFoo
struct foo
{
int a[5];
double b[10];
};
int main()
{
// populate some data (choose b [2] or other random entry.).
std::vector<foo> bar(10);
for(int ii = 0; ii < bar.size(); ii++)
bar[ii].b[2] = ii;
// access b[2] for each foo using an offset.
Readfoo newReadfoo;
newReadfoo.SetPoint(&(bar[0].b[2]), sizeof(foo)/sizeof(char));
for(int ii = 0; ii < bar.size(); ii++)
std::cout<<"\n"<<newReadfoo.printfoo(ii);
return 0;
}
在我看来,这是合法的,我想这就是我要问的。从现在开始,本质上,我正在将我对 struct foo 和向量 bar(foo 数组)的“解释”转换为单个字节数组或字符数组。
即在这种解释中,数据结构是单个字符数组,大小为 foo 乘以 bar 大小。当我用一个整数类型遍历它时,我本质上是在移动到一些假设的 char 元素(第 1 部分答案中的第 4.2 点)。 printfoo 函数然后将接下来的 8 个字节组合成一个双精度返回。
那么这是合法的吗?除了超出条形向量的范围之外,还有什么原因导致这不起作用(我已经测试过了,它还没有失败。)?
【问题讨论】:
-
您无法从观察程序中看出它没有具有未定义的行为。
-
sizeof(foo)/sizeof(char)将为bar中的第二个元素提供偏移量。sizeof(char)始终是1。 -
@DavidC.Rankin 我意识到 sizeof(foo)/sizeof(char) 基本上是 sizeof(char) 并且相当多余
-
如果您首先删除对
static_cast<void*>的强制转换,您的编译器是否不会警告"invalid static_cast from type ‘double*’ to type ‘char*’"?这不会为您带来危险信号吗? (您永远不应该转换为void*以避免静态转换错误)。您可以强制转换为char*(例如pchar = (char*)apstartDouble;)而不违反严格混叠规则,但直接静态强制转换会失败。除了简单地研究指针和寻址之外,您还试图完成什么? -
再次绕道
void*、char*和void*,原问题中的代码不会突然变得合法。它现在工作并不意味着你的编译器以后不会找到一些有趣的优化(在进一步的代码更改之后),因为代码没有遵循规则,所以会破坏你的程序。
标签: c++ pointers iteration pointer-arithmetic