【问题标题】:sizeof someStruct->someArray[i][j] always returns 4sizeof someStruct->someArray[i][j] 总是返回 4
【发布时间】:2014-01-08 18:22:03
【问题描述】:

我已经 [尝试] 为 zBuffer 实现一个二维数组,如下所示:

struct Properties {
     ....
     double** zBuffer;
     ....
}

这里是使用它的地方:

void initializeZBuffer(Properties* props){
    //Destroy old zBuffer 2D array (if it's already been initialized)
    if (sizeof props->zBuffer[0] >= 0){
        for (int i = 0; i < props->clientRect.Height(); i++){
            delete[] props->zBuffer[i];
        }
        delete[] props->zBuffer;
    }
    //Create new zBuffer 2D array
    props->zBuffer = new double*[props->clientRect.Height()]; //zBuffer height x width
    for (int i = 0; i < props->clientRect.Height(); i++){
        props->zBuffer[i] = new double[props->clientRect.Width()];
    }
}

我的目标是创建一个数组,为屏幕上的每个 x y 像素保存一个 z 值。

我的代码中的问题是:我检查数组中是否有任何数据——它不应该在第一次迭代时出现,但它确实存在。由于某种原因,每个插槽的大小为 4。

例如此时调试时:

sizeof props->zBuffer[1]  ----->  returns 4
sizeof props->zBuffer[100]  ----->  returns 4
sizeof props->zBuffer[1000000]  ----->  returns 4
sizeof props->zBuffer[10000000000]  ----->  returns 4

  sizeof props->zBuffer[1][1]  ----->  returns 4
    sizeof props->zBuffer[100][100]  ----->  returns 4
    sizeof props->zBuffer[1000000][1000000]  ----->  returns 4
    sizeof props->zBuffer[10000000000][10000000]  ----->  returns 4

由于它的大小为 4,我自然会尝试查看 props-&gt;zBuffer[3](最后一个插槽)中的内容,但我收到一个错误

ds->zBuffer[3]
CXX0030: Error: expression cannot be evaluated

有人知道发生了什么吗? 我完全感到困惑和沮丧:(

【问题讨论】:

  • 它是一个指针,而不是一个数组。指针不是数组。
  • 欲了解更多信息,请参阅stackoverflow.com/questions/2034450/…
  • 您似乎认为sizeof 告诉您内存分配的运行时大小。它没有。
  • sizeof 在编译时计算。
  • 你确定最后一组不都返回8吗?他们没有必须这样做,但我希望他们这样做。

标签: c++ arrays debugging


【解决方案1】:

sizeof 运算符产生其操作数的对象表示中的字节数。

我们以sizeof(props-&gt;zBuffer[1]) 为例。首先,props-&gt;zBuffer[1] 等价于*(props-&gt;zBuffer + 1)。如果我们将1 添加到double**,我们仍然有一个double**,如果我们随后取消引用它,我们会得到一个double*。然后你拿sizeof那个。在您的机器上,double* 占用 4 个字节。这是 double* 的对象表示形式 - 存储 double 的地址所需的字节数。

【讨论】:

  • 感谢您的解释。那么如何找到数组的大小呢?
  • @Imray 您需要在分配数组时将大小存储在某处,以便以后查找。我建议改用标准库容器类型,例如std::vector,而不是自己进行分配。
猜你喜欢
  • 2012-05-03
  • 1970-01-01
  • 2019-04-19
  • 2020-09-16
  • 2012-10-20
  • 2021-09-20
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
相关资源
最近更新 更多