如何正确初始化和分配复合结构?

时间:2012-11-12 13:24:29

标签: c

我需要创建和实现包含其中数组的结构的用法。如何正确初始化和分配struct和array?这是我当前的实现,似乎工作。但是,不确定是否正确的方式和结构分配在哪里(在堆栈或堆内存上)。恕我直言,对malloc的调用使得在堆上存储数组,但不确定剩余的struct成员。这是我的结构:

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

结构数据是否混合并放在堆栈和堆上,或者所有内容都驻留在一个地方?

3 个答案:

答案 0 :(得分: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,但一般来说未初始化的变量转到{{1} section和initialized变量转到.bss部分,当然动态分配的内存将像往常一样在堆上。

如果你担心效率,请查看这个问题:

Which is faster: Stack allocation or Heap allocation

答案 1 :(得分:2)

回答你的问题:如果myDataPacket是函数内部的局部变量,那么它将被置于堆栈中,而myDataPacket.objectList将被放置在堆上(并且还需要是免费的) “D)。

答案 2 :(得分:1)

更改

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

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

那应该可以解决你的问题。您当前正在分配许多MyDataPackets而不是ObjectData。