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));

NSLog:

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思ったように動かないかもしれません。sizeOfVertexsizeOfNormalはどちらも 32 ビット ポインターであるため、両方の正しいサイズは 4 です。割り当てられたメモリの実際のサイズを決定する移植可能な方法はありません。c で動的に割り当てられたメモリのサイズを決定するを参照してください。

于 2012-05-23T13:27:48.373 に答える