c - 如何为嵌套结构正确分配内存?
问题描述
我正在尝试创建一个非常简单的区块链用于教学目的。每个块包含各种简单变量和结构变量。区块链是一个简单的区块数组。
#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,您可能会遭受内存碎片的影响。
正如nm所说,blockchain[1] = malloc
其次blockchain[1] = newBlock
是肯定是错误的。您想要与 with 相同的策略blockchain[0]
,或者只是将内容推送到newBlock
then blockchain[1] = newBlock
:这里您只是分配指针,而不是值。
尽管如此,你的“类似区块链”的结构每个区块只能保存一个交易。通常,您需要可变数量的交易。由于在 C 数组中没有集成的长度计数器(它们只是一个连续的内存空间),因此您必须将块定义更改为以下内容:
struct block {
int index;
long timestamp;
int waitTime;
int transactions_len;
struct transaction transactions[];
};
这样,您可以分配一个可变长度的块,根据块的不同,它可以具有不同的长度。相关问题:将灵活的数组成员分配为结构
这样,您的 malloc 调用还需要包含事务的长度,并且仍将全部分配在连续的内存区域中。
我不能真正评论 sockaddr_in 结构,因为我不知道你会用它们做什么。根据它们的生命周期,您可能希望存储它们的副本(正如您所做的那样)或只是指向它们的指针,但这取决于您要对数据做什么以及修改/释放/的责任更改数据。
推荐阅读
- regex - 如何将原始字符串传递给 Zsh 中的变量?
- google-cloud-platform - 读取 datadog.yaml 文件的权限被拒绝
- c# - WPF 模板。模板选择器没有收到项目
- python - Windows 运行找不到批处理文件
- python - 如何用2个数组制作散点图?
- java - 将布尔参数传递给方法
- javascript - 在 axios 中链接请求,以便我可以对第一个请求的每个元素执行第二个请求
- sql - 使 SQL 查询在条件下失败
- amazon-web-services - 为什么在 terraform 中创建的 S3 存储桶需要存储桶策略来授予对 lambda 的访问权限
- python - python3.X 在关闭连接时记录 RotatingFileHandler 的问题