我需要创建和实现包含其中数组的结构的用法。如何正确初始化和分配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);
结构数据是否混合并放在堆栈和堆上,或者所有内容都驻留在一个地方?
答案 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
部分,当然动态分配的内存将像往常一样在堆上。
如果你担心效率,请查看这个问题:
答案 1 :(得分:2)
回答你的问题:如果myDataPacket
是函数内部的局部变量,那么它将被置于堆栈中,而myDataPacket.objectList
将被放置在堆上(并且还需要是免费的) “D)。
答案 2 :(得分:1)
更改
myDataPacket->objectList = malloc(objectNum * sizeof(MyDataPacket));
到
myDataPacket->objectList = malloc(objectNum * sizeof(ObjectData));
那应该可以解决你的问题。您当前正在分配许多MyDataPackets而不是ObjectData。