【问题标题】:How to properly allocate memory for nested structures?如何为嵌套结构正确分配内存?
【发布时间】:2019-03-24 12:57:18
【问题描述】:

我正在尝试创建一个非常简单的区块链用于教学目的。 每个块包含各种简单变量和结构变量。 区块链是一个简单的区块数组。

#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;
}

这对吗?

非常感谢

【问题讨论】:

  • 嗯,不。这是不正确的。 blockchain[1]=malloc ... 分配内存,然后blockchain[1] = newBlock 丢弃该内存,造成内存泄漏。顺便说一句,强制转换 malloc 的结果是不必要的,而且往往会适得其反。

标签: c pointers struct declaration


【解决方案1】:

这最终将取决于您想要示例的目的。这是一个相当开放的问题,可能会引起近距离投票的注意。

struct block **blockchain 上的双指针可能是一个不错的选择,这取决于您是否希望所有 blockchain[i] 数据都是连续的。如果您对每个元素使用单独的 malloc,您可能会遇到内存碎片。

作为 n.m.说,blockchain[1] = malloc 后跟blockchain[1] = newBlock 肯定是错误的。您想要与blockchain[0] 相同的策略,或者只是将内容推送到newBlock 然后blockchain[1] = newBlock:这里您只是分配指针,而不是值。

不过,您的“类似区块链”的结构在每个区块中只能保存一个交易。通常,您需要可变数量的交易。由于在 C 数组中没有集成长度计数器(它们只是一个连续的内存空间),因此您必须将块定义更改为以下内容:

struct block { 
    int index;
    long timestamp;
    int waitTime;
    int transactions_len;
    struct transaction transactions[];
};

这样,您可以分配一个可变长度的块,根据块的不同,它可以有不同的长度。相关问题:allocating flexible array members as a struct

这样,您的 malloc 调用还需要包含事务的长度,并且仍将全部分配在连续的内存区域中。

我不能对 sockaddr_in 结构发表评论,因为我不知道你会用它们做什么。根据它们的生命周期,您可能希望存储它们的副本(正如您所做的那样)或只是指向它们的指针,但这取决于您要对数据做什么以及修改/释放/的责任修改数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2017-07-26
    • 2021-08-31
    相关资源
    最近更新 更多