4

内部に配列を含む構造体の使用法を作成して実装する必要があります。構造体と配列の適切な初期化と割り当てを行う方法は?これが私の現在の実装で、うまくいくようです。ただし、それが適切な方法であり、構造体がどこに割り当てられているか(スタックまたはヒープメモリ上)はわかりません。私見では、mallocを呼び出すと、配列がヒープに格納されますが、残りの構造体メンバーについてはわかりません。これが私の構造体です:

typedef struct {

  uint8_t objectSize;
  double objectDepth; 

} ObjectData;

typedef struct {

  ObjectData *objectList;
  double startMark;
  double endMark;

} MyDataPacket; 

構造体を埋めて返す関数は次のとおりです。

void getMyPacket(MyDataPacket *myDataPacket, uint8_t objectNum)
{
  myDataPacket->startMark = 10.0; 
  myDataPacket->endMark = 60.0; 
  myDataPacket->objectList = malloc(objectNum * sizeof(MyDataPacket));

  uint8_t x;
  for (x = 0; x < objectNum; x++)
  { 
    myDataPacket->objectList[x].objectSize = x; // just test values
    myDataPacket->objectList[x].objectDepth = x; // just test values
  }
}

これが関数呼び出し部分です:

uint8_t objectNum = 10;
MyDataPacket myDataPacket;
getMyPacket(&myDataPacket, objectNum);

構造体データが混在してスタックとヒープの両方に配置されていますか、それともすべてが1か所にありますか?

4

3 に答える 3

4

がヒープに割り当てられている場合myDataPacket、すべてがヒープ上にあります。

MyDataPacket *myDataPacket = malloc(sizeof(MyDataPacket));

myDataPacketが自動変数の場合、ポインタ自体を含め、すべてがスタック上に存在しますが、それが指すメモリはヒープ上にあります。objectList

MyDataPacket myDataPacket; //this is all on the stack
myDataPacket->objectList = malloc(...) //memory allocated here is on the heap

グローバル変数の場合、初期化されているかどうか、初期化されているかどうかによって異なりますzeroが、一般的には、初期化されていない変数は.bssセクションに移動し、初期化された変数はセクションに移動しますdata。もちろん、動的に割り当てられたメモリはオンになります。いつものようにヒープ。

効率が心配な場合は、このSOの質問を確認してください。

どちらが速いか:スタック割り当てまたはヒープ割り当て

于 2012-11-12T13:34:17.963 に答える
2

質問に答えるには:myDataPacketが関数内のローカル変数である場合、それはスタックにmyDataPacket.objectList配置され、ヒープに配置されます(また、解放する必要があります)。

于 2012-11-12T13:27:59.100 に答える
1

変化する

myDataPacket->objectList = malloc(objectNum * sizeof(MyDataPacket));

myDataPacket->objectList = malloc(objectNum * sizeof(ObjectData));

それはあなたの問題を解決するはずです。現在、ObjectDataの代わりに多数のMyDataPacketsを割り当てています。

于 2012-11-12T14:11:04.943 に答える