我有两个数组,每个数组初始化如下:
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]
答案 0 :(得分:1)
list1
和list2
的类型为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**
。这应该处理你遇到的警告。