Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在链表中键入空指针_C_Arrays_Struct_Linked List - Fatal编程技术网

C 在链表中键入空指针

C 在链表中键入空指针,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的结构数组,我希望将它们存储在一个链接列表中(用更好的术语指出),因此我对arrayOfStrucs进行了malloc

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>到 Value*/Cuff>在C. C++中严格来说是不必要的,它不会,也有缺点,正如WhozCraig在他的文章中指出的那样。所以在那里选择你的毒药。

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我在答案中添加了一条免责声明,引用了您的评论。我希望现在情况更清楚。