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) 之后和步骤 (3) 完成之前更改列表时容易出现竞争条件。
现在对于你的具体问题,循环体应该被这样的东西代替:
bcopy(&ptr1->blkext_device, ioctl_ptr + i, sizeof(struct blkext_node));
ptr1 = ptr1->next;
考虑检查循环头中是否也有 ptr1 != NULL
,以至少在出现竞争条件时不会使内核崩溃。
假设我有一个 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) 之后和步骤 (3) 完成之前更改列表时容易出现竞争条件。
现在对于你的具体问题,循环体应该被这样的东西代替:
bcopy(&ptr1->blkext_device, ioctl_ptr + i, sizeof(struct blkext_node));
ptr1 = ptr1->next;
考虑检查循环头中是否也有 ptr1 != NULL
,以至少在出现竞争条件时不会使内核崩溃。