1

我有一个 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));

NS日志:

sizeOfTempVertex:432 sizeOfTempNormal:432

sizeOfVertex: 4 sizeOfNormal: 4

4

4 回答 4

8

sizeof告诉你类型的大小(在编译时计算)。它不会告诉您动态分配了多少内存。1


1. C99 变长数组的特殊情况除外。

于 2012-05-23T13:26:13.313 回答
2

m_VertexData 和 m_normalData 是指针,所以它们的大小是 sizeof(无论它有什么类型 *),所以它分配了正确的内存量。您需要分配 sizeof(数组成员) * 内存的项目字节数。顺便说一下,与 malloc 相关的一些事情:

  1. 不要强制转换 malloc 的返回值。它使代码不可读并且没有必要,因为 void * 被隐式提升为分配给它的任何指针类型。
  2. 不要使用sizeof(type),而是sizeof(variable)。如果你改变了变量的类型,它会导致难以追踪的错误。

考虑到这些点,请使用以下代码:

m_VertexData = malloc(sizeof(*m_VertexData) * numberOfItems);
于 2012-05-23T13:34:26.653 回答
2

根据 C 标准,第 6.5.3.4.2 节:

sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或带括号的类型名称。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果是一个整数常量。

在您的情况下,操作数m_VertexDatam_NormalData是指针(这是有道理的,因为您刚刚为它们分配了调用的结果malloc)。因此,它们的大小与系统上任何其他指针的大小相同 - 4 个字节。

如果您想知道,没有标准的方法可以确定您拥有多少内存malloc。如果您需要该大小以供将来参考,则需要将该数字存储在单独的变量中。

于 2012-05-23T13:36:17.120 回答
0

sizeof可能无法按照您认为的方式工作。sizeOfVertex并且sizeOfNormal都是 32 位指针,因此 4 是它们的正确大小。没有可移植的方法来确定分配内存的实际大小。请参阅确定 c 中动态分配内存的大小

于 2012-05-23T13:27:48.373 回答