在C中取消引用动态数组中的指针

时间:2013-05-05 03:10:25

标签: c arrays malloc

我有两个数组,每个数组初始化如下:

struct file_descriptor *list1 = (struct file_descriptor *)malloc(4096 * sizeof(struct file_descriptor));

struct file_descriptor *list2 = (struct file_descriptor *)malloc(4096 * sizeof(struct file_descriptor));

每个数组本质上都是struct file_descriptor指针的列表。

现在list1已经在数组中有一个指针(指向struct file_descriptor),我需要在list2中指向相同的对象list1 {1}}指针指向。因此,如果list1[2] = some_object,我也会尝试指出list2[2] = some_object

所以:

int i;
for(i = 3; i < 4096; i++) {
    struct file_descriptor *parent_fd = &list1[i]; // points to the struct that element at i points to in list1
    list2[i] = parent_fd;
}

在循环的第2行,这会抛出: incompatible types when assigning to type ‘struct file_descriptor’ from type ‘struct file_descriptor *’错误。

显然,那是因为list2[i]是实际的struct file_descriptor,而不是list2中指向该结构的指针。将其更改为&list2[i] = parent_fd;也会导致错误,因为&list2[i]不是左值。

如何取消引用索引i中数组中的指针,以便list2[i]指向*list1[i]

1 个答案:

答案 0 :(得分:1)

list1list2的类型为struct file_descriptor **而不是struct file_descriptor *

此外,请勿在循环中声明 struct file_descriptor指针或变量

无论如何,如果你希望list2中的指针指向与list1中相应指针相同的结构变量,那么它就相当简单。你可以这样做:

 for(i=0;i<=4096;i++)
 list2[i]=list1[i];

此外,如果您希望数组是结构变量pointers的数组,而不是结构变量数组,那么您应该使用以下内容:

   malloc(4096 * sizeof(struct file_descriptor*));  //note the second *

修改您的专线list2[i] = parent_fd;显示类型不匹配,因为您已声明list2类型为struct file_descriptor*,因此list2[i]的类型为{{ 1}},而struct file_descriptor的类型为parent_fd。简单来说,struct file_descriptor*的左侧是结构变量,而右侧是指向结构变量的指针。就像我说的那样,你应该将=list1声明为类型list2而不是struct file_descriptor**。这应该处理你遇到的警告。