sizeof数组结构错误

时间:2015-10-12 00:38:22

标签: c++ opengl

我正在尝试使用某些数据来创建初始化 VAO特定索引的功能。问题是,当我访问 sizeof vertices 时,返回错误的大小。

以下是数据:

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并正确显示数据。

3 个答案:

答案 0 :(得分:2)

在C ++中,编译器将any_type[]类型的函数参数视为any_type*

因此vertices的类型实际上是一个指针,并且您正在使用sizeof(vertices)获得指针的大小。

  • 如果您需要知道传递给函数的数组的大小,可以将其大小作为另一个参数传递。
  • 或者你可以像vsoftco所说的那样,在这种情况下,函数模板将针对传递给函数的每个不同数组大小进行实例化。
  • 如果你想成为&#34;现代&#34;您还可以传递std::arraystd::vector,其中包含有关其大小的信息。

答案 1 :(得分:1)

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

您可以在之前提到的类似问题here中找到更多详细信息。

答案 2 :(得分:1)

每次按值将数组传递给函数时,它都会衰减为指针,无论您将其作为arr[]arr[size]传递,因此{{1}报告的大小将是一个指针,即一般4或8个字节。如果要传递数组并“检测”其大小,可以通过模板非类型参数通过引用传递它,如下面的简单示例所示:

sizeof