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

#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,则可能会遭受内存碎片的困扰。

下午说,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结构,因为我不知道您将使用它们什么。根据它们的生命周期,您可能想要存储它们的副本(在执行操作时)或仅指向它们的指针,但这取决于您要对数据执行的操作以及修改/释放/负责的责任。更改数据。

07-27 20:02