C程序:如何将链表复制到动态数组?

C program: How to copy linked list to dynamic array?

假设我有一个 disk_info 的结构,成员为 devname 和 devno。我已经创建了相同的链表。现在我想将这个链表转换为连续内存,以便通过ioctl轻松将数据传递给内核。在内核端,我想再次读取连续内存并转换为数组 基本上我想转换链表数组链表。

struct blkext_node {
    dev_t   devno;
    char    devname[32];
};

typedef struct blkext_disk_info {
    struct blkext_node blkext_device;
    struct blkext_disk_info *next;
} blkext_disk_info_t;

ptr1 = head_list
// Allocate the contiguous memory where total_cnt is the no of nodes in linked list
ioctl_ptr = (struct blkext_node *)malloc(total_cnt*sizeof(struct blkext_node));

for(i=0; i<total_cnt; i++) {
    if(ptr1!=NULL) {
        memcpy(ioctl_ptr + i, ptr1, sizeof(struct blkext_node));
        ptr1=ptr1->next;
    } else 
            break;

}

这是最终的工作代码。

这是一般程序:

  1. 遍历列表以确定其长度
  2. 分配一个大小合适的数组
  3. 再次遍历列表并将每个项目复制到数组中的一个槽中。

这个过程对于大多数用途来说已经足够好了,但是当另一个线程在步骤 (1) 之后和步骤 (3) 完成之前更改列表时容易出现竞争条件。

现在对于你的具体问题,循环体应该被这样的东西代替:

bcopy(&ptr1->blkext_device, ioctl_ptr + i, sizeof(struct blkext_node));
ptr1 = ptr1->next;

考虑检查循环头中是否也有 ptr1 != NULL,以至少在出现竞争条件时不会使内核崩溃。