我有一个OpenGL程序,但无法正确分配。
m_VertexData = (GLfloat*)malloc(sizeof(m_TempVertexData));
m_NormalData = (GLfloat*)malloc(sizeof(m_TempNormalData));
NSLog(@"sizeOfTempVertex: %d sizeOfTempNormal: %d", sizeof(m_TempVertexData),sizeof(m_TempNormalData));
NSLog(@"sizeOfVertex: %d sizeOfNormal: %d",sizeof(m_VertexData),sizeof(m_NormalData));
NSLog:
尺寸温度顶点: 432 尺寸温度正常: 432
顶点尺寸: 4 正常尺寸: 4
sizeof
告诉您类型的大小(在编译时计算)。 它不会告诉您动态分配了多少内存。1
1. C99 可变长度数组的特殊情况除外。
m_VertexData和m_normalData是指针,因此它们的大小是sizeof(无论它有*的类型是什么),因此它分配了正确的内存量。您需要分配 sizeof(数组成员)* 内存的项目字节数。顺便说一下,与malloc相关的一些事情:
- 不要强制转换 malloc 的返回值。它使代码不可读,并且没有必要,因为 void * 被隐式提升为分配给它的任何指针类型。
- 不要使用
sizeof(type)
,而是sizeof(variable)
。如果您更改变量的类型,则会导致难以追踪的错误。
考虑到这些要点,请使用以下代码:
m_VertexData = malloc(sizeof(*m_VertexData) * numberOfItems);
根据C标准第6.5.3.4.2节:
sizeof 运算符产生其操作数的大小(以字节为单位),这可能是一个 表达式或类型的括号名称。大小由类型确定 操作数。结果是一个整数。如果操作数的类型是可变长度数组 类型,计算操作数;否则,不计算操作数,结果为 整数常量。
在您的情况下,操作数 m_VertexData
和 m_NormalData
是指针(这是有道理的,因为您刚刚将调用 malloc
的结果分配给它们)。因此,它们的大小与系统上任何其他指针的大小相同 - 4 字节。
如果您想知道,没有标准方法可以确定您有多少内存malloc
-ed;如果您需要该大小以供将来参考,则需要将该数字存储在单独的变量中。
sizeof
可能无法按照您认为的方式工作。 sizeOfVertex
和 sizeOfNormal
都是 32 位指针,因此 4 是它们的正确大小。没有便携式方法来确定分配内存的实际大小;请参阅在 C 中确定动态分配的内存的大小。