C 在链表中键入空指针
我有一个名为arrayOfElements的结构数组,我希望将它们存储在一个链接列表中(用更好的术语指出),因此我对arrayOfStrucs进行了mallocC 在链表中键入空指针,c,arrays,struct,linked-list,C,Arrays,Struct,Linked List,我有一个名为arrayOfElements的结构数组,我希望将它们存储在一个链接列表中(用更好的术语指出),因此我对arrayOfStrucs进行了malloc arrayOfElements= malloc(4 * sizeof(Element)); 一旦我把所有的数据都放进去,我想把它传递给一个名为insert的函数,这个函数导入列表的头和结构数组 LinkedList* insert(LinkedList* head, Element* inArrayOfElements) 我的问题是
arrayOfElements= malloc(4 * sizeof(Element));
一旦我把所有的数据都放进去,我想把它传递给一个名为insert的函数,这个函数导入列表的头和结构数组
LinkedList* insert(LinkedList* head, Element* inArrayOfElements)
我的问题是,我被告知链表中的数据成员必须是void*,这是一个硬要求。所以我的问题是,在函数insert中,如何从链表中生成void*数据
typedef struct LinkedList {
void* data
struct LinkedList* next;
} LinkedList;
指向导入的结构数组
LinkedList* insert(LinkedList* head, Element* inArrayOfElements)
{
LinkedList* insertNode = malloc(sizeof(LinkedList));
insertNode->next = head;
/*WHAT DO I DO HERE TO MAKE void* data point to inArrayOfELements*/
return insertNode;
}
可以强制转换为空指针,如下所示:
inserNode->data = (void*)inArrayOfElements;
// ^ Explicit cast here
如果您要在链表的数据
字段中存储多种类型的数据,则此要求非常有意义
请注意,在C中,这样的强制转换是可选的,并且仅用于可读性目的。从<代码>任何**/COD>到
insertNode->data=inarayofements
?我不确定rayof元素中的inserNode->data=(void*)
。如果要使用链表存储不同类型的元素,则此要求是有意义的。但是您需要一些字段来了解节点中的数据。如果只存储元素
指针,void*
类型要求相当奇怪。是的,这种情况下类型转换(void*)
更好,我的不好。谢谢,我想这是因为数组中的每个结构都会包含不同的数据类型,所以ArrayFelements[1]可以是int和ArrayFelements[0]可能是一个string@RoadRunner实际上,在C语言中,对void*进行类型转换是毫无意义的。转换是在两个方向上自动完成的。你最初的命令似乎是正确的,尽管问题并不十分清楚。我无法判断OP是想将InrayOfeElements
中的每个元素存储为列表中的单个节点(如果是,数组大小参数在哪里?),还是只存储一个数据指向基数组指针的节点。从AnyObjectType*
到void*
再回到C中是自动转换的。不需要石膏。不一定。它也使它更脆。如果/当条件发生变化,例如参数不再是基本指针类型,则强制转换将愉快地(并且毫无帮助地)隐藏错误。用C++,它将是曼德里,但在C,有很多理由避免它。如果要在使用和不使用不必要的强制转换之间做出选择,请选择后者。@WhozCraig我在答案中添加了一条免责声明,引用了您的评论。我希望现在情况更清楚。