无法在 Objective-C/C 中正确 malloc



我有一个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相关的一些事情:

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

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

m_VertexData = malloc(sizeof(*m_VertexData) * numberOfItems);

根据C标准第6.5.3.4.2节:

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

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

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

sizeof可能无法按照您认为的方式工作。 sizeOfVertexsizeOfNormal 都是 32 位指针,因此 4 是它们的正确大小。没有便携式方法来确定分配内存的实际大小;请参阅在 C 中确定动态分配的内存的大小。

相关内容

  • 没有找到相关文章

最新更新