Sizeof数组结构错误

sizeof array struct error

本文关键字:错误 结构 数组 Sizeof      更新时间:2023-10-16

我试图使在特定索引上初始化 VAO的函数,与一些数据。问题是,当我访问sizeof顶点时,返回的大小是错误的。

数据如下:

typedef struct {
    GLfloat XYZW[4];
    GLfloat RGBA[4];
} Vertex;
const Vertex Vertices2[] =
{
    { { 0.25f, 0.25f, 0.0f, 1.0f },{ 1.0f, 0.0f, 0.0f, 1.0f } },
    { { 0.75f, 0.25f, 0.0f, 1.0f },{ 0.0f, 1.0f, 0.0f, 1.0f } },
    { { 0.50f, 0.75f, 0.0f, 1.0f },{ 0.0f, 0.0f, 1.0f, 1.0f } }
};
const Vertex Indices2[] = {....}

我这样调用函数:

createArrayObjects(0, Vertices2, Indices2);
void createArrayObjects(int index, const Vertex vertices[], const GLubyte indices[]){
    cout << sizeof(vertices) << endl;  ---> returns 4
    cout << sizeof(Vertices2) << endl; ---> returns 96
...
}

如果我使用sizeof(Vertices2),填充VBO,程序运行良好。如果输入vertices上没有正确的大小,我就无法填充VAO和VBO并正确地显示数据。

在c++中,any_type[]类型的函数参数被编译器当作any_type*处理。

所以vertices的类型实际上是一个指针,你得到的是sizeof(vertices)指针的大小。

  • 如果你需要知道你传递给函数的数组的大小,你可以把它的大小作为另一个参数传递。
  • 或者你可以像vsoftco说的那样做,在这种情况下,函数模板将为你传递给函数的每个不同数组大小实例化。
  • 如果你想要"现代",你也可以传递std::arraystd::vector,它们携带有关它们大小的信息。

任何时候你通过值传递一个数组给一个函数,它衰减到一个指针,不管你传递它作为arr[]arr[size]的事实,所以sizeof报告的大小将是一个指针,即一般4或8字节。如果你想传递一个数组并"检测"它的大小,你可以通过引用通过一个模板非类型参数传递它,就像下面的简单例子:

#include <iostream>
template<typename T, int N>
void f(T(&arr)[N])
{
    std::cout << "Size: " << N;
}
int main()
{
    double arr[10];
    f(arr); // outputs 10
}

你传递给函数的参数const Vertext vertices[]本质上是一个指针,这就是为什么它显示为大小4。你必须以其他方式将数组的大小传递给函数,例如将大小作为单独的参数传递。

您可以在前面的类似问题中找到更多细节。