【问题标题】:Print void pointer in a Linked List在链接列表中打印 void 指针
【发布时间】:2017-03-09 14:35:46
【问题描述】:

我有一个名为 arrayOfElements 的结构数组,这些结构称为 Elements ,它有一个 void 指针

typedef struct {
    void* data;
} Element;

我已经 malloc 的 arrayOfElements

Element* arrayOfElements;
arrayOfElements= malloc(4 * sizeof(Element));

并在结构中存储了整数和字符串

arrayOfElements[3].data = malloc( sizeof(int) );
ptr = arrayOfElements[3].data;
*ptr = 65;

strcpy(arrayOfElements[1].data, token);

然后我创建了一个链表

typedef struct LinkedList {
    void* arrayOfStruct;
    struct LinkedList* next;
} LinkedList;

并创建了一个函数来导入 arrayOfELements 的实例并使 void* arrayOfStruct 指向它

LinkedList* insert(LinkedList* head, Element* inArrayOfElements) { 
    LinkedList* insertNode = malloc(sizeof(LinkedList));

    insertNode->next = head;
    insertNode->arrayOfStruct = (void*)inArrayOfElements;

    return insertNode;
}

问题

我的问题是在我将 void* arrayOfStruc 指向 arrayOfELements 的一个实例之后,我如何打印我之前知道的 arrayOfElements[3] 的 void* 数据是一个 int 并且它的值为 65

LinkedList 中的当前节点 ---> arrayOfElements[3] --> Element 结构中的数据成员(应该等于 65)

我觉得我应该指向一个 int 指针然后打印它,但我不确定这样做的语法

【问题讨论】:

    标签: c pointers struct linked-list


    【解决方案1】:

    您需要通过某种方式了解data 成员指向的数据类型。表示类型的附加元素将起作用。

    typedef enum {
        STR_TYPE,
        INT_TYPE,
        ...
    } data_type;
    
    typedef struct {
        data_type type;
        void* data;
    } Element;
    

    然后你可以像这样设置元素:

    arrayOfElements[3].type = INT_TYPE;
    arrayOfElements[3].data = malloc( sizeof(int) );
    int *ptr = arrayOfElements[3].data;
    *ptr = 65;
    
    arrayOfElements[1].type = STR_TYPE;
    strcpy(arrayOfElements[1].data, token );
    

    然后这样读:

    Element *curr = &list_node->arrayOfStruct[3];
    if (curr->type == INT_TYPE) {
        int *pint = curr->data;
        printf("int data = %d\n", *pint);
    }
    

    【讨论】:

    • 谢谢你,我什至没有想过设置一个类型变量。 &list_node 是指向当前节点的指针吗? (或者我想要读取的任何节点),那么 curr 指向 arrayOfStruct[3] ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2017-04-22
    • 1970-01-01
    • 2018-04-30
    • 2020-04-17
    • 1970-01-01
    • 2017-08-16
    相关资源
    最近更新 更多