如何为嵌套结构正确分配内存?
How to properly allocate memory for nested structures?
我正在尝试创建一个非常简单的区块链用于教学目的。
每个块包含各种简单变量和结构变量。
区块链是一个简单的区块数组。
#define BLOCKCHAIN_MAX_SIZE 1000
struct transaction{
struct sockaddr_in sender_ip_port;
int quantity;
struct sockaddr_in receiver_ip_port;
int randomNumber;
};
struct block {
int index;
long timestamp;
struct transaction transaction;
int waitTime;
};
int main(int argc, char *argv[]) {
struct block **blockchain = malloc(sizeof(struct block *) * BLOCKCHAIN_MAX_SIZE);
blockchain[0]=malloc(sizeof(struct block));
blockchain[0]->index = 0;
blockchain[0]->waitTime= 0;
blockchain[0]->timestamp = 1549035455;
blockchain[0]->transaction.quantity= 0;
blockchain[0]->transaction.randomNumber= 0;
struct block *newBlock= (struct block *)malloc(sizeof(struct block));
//Fill up the new block with data
blockchain[1]=malloc(sizeof(struct block));
blockchain[1] = newBlock;
}
这是正确的吗?
非常感谢
这最终将取决于您想要示例的目的。这是一个相当开放的问题,可能会引起势均力敌的投票的注意。
您在 struct block **blockchain
上的双指针可能是一个不错的选择,这取决于您是否希望所有 blockchain[i]
数据连续。如果您为每个元素使用单独的 malloc,您可能会遇到内存碎片问题。
作为n.m。说 blockchain[1] = malloc
后跟 blockchain[1] = newBlock
绝对是错误的。您想要与 blockchain[0]
相同的策略,或者只是将内容推送到 newBlock
然后 blockchain[1] = newBlock
:这里您只是分配指针,而不是值。
不过,您的 "blockchain-like" 结构每个区块只能容纳一个交易。通常,您需要可变数量的交易。由于在 C 中数组没有集成的长度计数器(它们只是连续的 space 内存),您必须将块定义更改为以下内容:
struct block {
int index;
long timestamp;
int waitTime;
int transactions_len;
struct transaction transactions[];
};
这样,您可以分配可变长度的块,根据块的不同,它可以有不同的长度。相关问题:allocating flexible array members as a struct
这样,您的 malloc 调用还需要包括事务的长度,并且仍然会全部分配在连续的内存区域中。
我无法真正评论 sockaddr_in 结构,因为我不知道您会用它们做什么。根据它们的生命周期,您可能想要存储它们的副本(就像您正在做的那样)或只是指向它们的指针,但这将取决于您要对数据做什么以及它对 modify/free/alter 数据。
我正在尝试创建一个非常简单的区块链用于教学目的。 每个块包含各种简单变量和结构变量。 区块链是一个简单的区块数组。
#define BLOCKCHAIN_MAX_SIZE 1000
struct transaction{
struct sockaddr_in sender_ip_port;
int quantity;
struct sockaddr_in receiver_ip_port;
int randomNumber;
};
struct block {
int index;
long timestamp;
struct transaction transaction;
int waitTime;
};
int main(int argc, char *argv[]) {
struct block **blockchain = malloc(sizeof(struct block *) * BLOCKCHAIN_MAX_SIZE);
blockchain[0]=malloc(sizeof(struct block));
blockchain[0]->index = 0;
blockchain[0]->waitTime= 0;
blockchain[0]->timestamp = 1549035455;
blockchain[0]->transaction.quantity= 0;
blockchain[0]->transaction.randomNumber= 0;
struct block *newBlock= (struct block *)malloc(sizeof(struct block));
//Fill up the new block with data
blockchain[1]=malloc(sizeof(struct block));
blockchain[1] = newBlock;
}
这是正确的吗?
非常感谢
这最终将取决于您想要示例的目的。这是一个相当开放的问题,可能会引起势均力敌的投票的注意。
您在 struct block **blockchain
上的双指针可能是一个不错的选择,这取决于您是否希望所有 blockchain[i]
数据连续。如果您为每个元素使用单独的 malloc,您可能会遇到内存碎片问题。
作为n.m。说 blockchain[1] = malloc
后跟 blockchain[1] = newBlock
绝对是错误的。您想要与 blockchain[0]
相同的策略,或者只是将内容推送到 newBlock
然后 blockchain[1] = newBlock
:这里您只是分配指针,而不是值。
不过,您的 "blockchain-like" 结构每个区块只能容纳一个交易。通常,您需要可变数量的交易。由于在 C 中数组没有集成的长度计数器(它们只是连续的 space 内存),您必须将块定义更改为以下内容:
struct block {
int index;
long timestamp;
int waitTime;
int transactions_len;
struct transaction transactions[];
};
这样,您可以分配可变长度的块,根据块的不同,它可以有不同的长度。相关问题:allocating flexible array members as a struct
这样,您的 malloc 调用还需要包括事务的长度,并且仍然会全部分配在连续的内存区域中。
我无法真正评论 sockaddr_in 结构,因为我不知道您会用它们做什么。根据它们的生命周期,您可能想要存储它们的副本(就像您正在做的那样)或只是指向它们的指针,但这将取决于您要对数据做什么以及它对 modify/free/alter 数据。