c - Typedef 结构不能转换为指针

标签 c struct

我在多个帖子中看到过这个问题,但我还没有找到一个对我有很好解释的帖子。我正在尝试创建一个链表,但是在没有错误的情况下无法调用结构或函数无法转换为指针。这真的很烦我。对于如何使这项工作正常进行的任何帮助,我们将不胜感激。下面是一些代码,这就是问题所在。

typedef struct node
{
    void *data;
    struct node *next;
} node;

node *head = NULL;

node* create(void *data, node *next)
{
    node *new_node = (node*)malloc(sizeof(node));
    if(new_node == NULL)
    {
        exit(0);
    }else{

        new_node->data = data;
        new_node->next = next;
        return new_node;
    }

}

node* prepend(node *head, void *data)
{
    node *new_node = create(data,head);
    head = new_node;
    return head;
}


void preload_adz(int adz_fd)
{
    struct adz adz_info;
    char adz_data[40];
    char adz_text[38];
    int adz_delay;
    char adz_delayS[2];

    read(adz_fd,adz_data,40);
    strncpy(adz_text,adz_data + 2,40-2);
    sprintf(adz_delayS, "%c%c",adz_data[0],adz_data[1]);
    adz_delay = atoi(adz_delayS);

    adz_info.delay = adz_delay;
    strncpy(adz_info.text,adz_text,38);

    head = prepend(head, (void*)adz_info); //<---This line throws the error

    while(read(adz_fd,adz_data,40) > 0)
    {

    }
}

最佳答案

struct adz adz_info;

...

head = prepend(head, (void*)adz_info); //<---This line throws the error

这里的问题是 adz_info 不是指针,它是堆栈上的实际结构。将 adz_info 传递到函数中将复制结构。

您需要一个指向该结构的指针。使用 & 获取其地址。获得指针后,无需将其转换为 void 指针,该转换是自动的。

head = prepend(head, &adz_info);

请注意,类型转换是一种簿记。转换为 void * 不会将结构转换为指针,它表示“编译器,忽略此变量的声明类型,相信我这是一个 void 指针”。

关于c - Typedef 结构不能转换为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43462493/

相关文章:

go - 如何在结构体中正确构造结构体

c - char **p,char *p[],char p[][]的区别

c - 如何在 C 中存储值 10^20?

检查结构数组中非空字符串的数量;将 NULL 值分配给结构数组中的 char 数组

golang - 取消引用后从结构中获取接口(interface)实现实例

c# - 具有最初无效字段的结构

c++ - C字符串函数的实现

c - 将指针分配给数组的正确方法

c - 在哪里复制 mpi 的可执行文件?

c++ - 在类中为变量分配方法值