struct的access元素传递给void *指针

时间:2012-10-21 05:33:01

标签: c struct binary-tree typedef void-pointers

我正在使用二叉搜索树数据结构来对具有类型定义的一系列结构进行排序:

typedef struct {
    char c;
    int index;
} data_t;

typedef struct node node_t;

typedef node {
    void *data;
    node_t *left;
    node_t *right;
}

node_t typedef来自为此目的提供给我的库,可能是带有void *指针以确保多态性。 node将传递给函数:

static void *recursive_search_tree(node_t *root, void *key, int cmp(void*,void*))

在recursive_search_tree函数中,我希望能够修改代码以使用index元素作为条件来找到最接近字符数组的线性传递索引的匹配,这最终将涉及data_t传入*key并在函数内访问key->index

问题

是否可以访问key->index,其中key是void*指向data_t结构,或者仅当data_t被声明为类型时才可以访问键?我试图做后者,但是即使将指针转换为int也似乎没有通过编译器。

2 个答案:

答案 0 :(得分:3)

当然可以,你将key转换为*data_t类型。 (只要这真的是key所指向的!)

key                     /* argument of type void* */
(data_t*)key            /* cast as type data_t*   */
((data_t*)key)->index   /* dereferenced */

这是一个简单的例子:

#include <stdlib.h>
#include <stdio.h>

typedef struct {
    char    c;
    int     index;
} data_t;

typedef struct node {
    void    *data;
    struct node *left;
    struct node *right;
} node_t;

static int cmp(void *lhs, void *rhs)
{
    return ((data_t *)lhs)->index - ((data_t *)rhs)->index;
}

int main(void)
{
    data_t d0;
    data_t d1;

    d0.c     = 'A';
    d0.index = 1;
    d1.c     = 'B';
    d1.index = 2;

    printf("d0 < d1? %s\n", (cmp((void *)&d0, (void *)&d1) < 0 ? "yes" : "no"));
    printf("d1 < d0? %s\n", (cmp((void *)&d1, (void *)&d0) < 0 ? "yes" : "no"));

    return EXIT_SUCCESS;
}

答案 1 :(得分:0)

这种类型不安全,任何使用void都是如此。空隙的使用通常是因为中间体保留在其他人不方便使用的东西上。 这是一个C函数,可以让你在树中保存任何你想要的东西。 它所做的就是返回你给它的任何指针。

在您的搜索功能中

int cmp(void* dt1, void* dt2)
{
data_t*  data1 = (data_t*)dt1;
data_t*  data2 = (data_t*)dt2;
/* Do what you need with data1 and data2 here */
}

应该让你做任何你需要的事情。您遇到的问题是需要在函数内部转换值。 cmp的参数应与您正在使用的库的API完全匹配,其中参数的void *。