【问题标题】:Typedef struct cannot be cast to pointerTypedef 结构不能转换为指针
【发布时间】:2017-04-18 02:16:42
【问题描述】:

我在多个帖子中看到过这个问题,但我还没有找到一个对我有很好解释的问题。我试图创建一个链表,但是如果没有得到错误就不能调用结构和函数,不能将其转换为指针。它真的困扰着我。任何有关如何使其正常工作的帮助将不胜感激。下面的一些代码就是问题所在。

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)
    {

    }
}

【问题讨论】:

  • 您不能将结构转换为指针。您究竟想在那里实现什么目标?
  • 我正在尝试启动链表,正在学习一些教程,这正是教程中的做法:/ zentut.com/c-tutorial/c-linked-list/#C_Linked_List_Program
  • (void*)adz_info --> &amp;adz_info ?
  • @BLUEPIXY 这就是问题所在。哈哈。我傻了。
  • 你好 exit(0) 当 malloc 严重失败时

标签: c struct


【解决方案1】:
struct adz adz_info;

...

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

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

您需要一个指向该结构的指针。使用&amp; 获取其地址。一旦有了指针,就不需要将其强制转换为 void 指针,该强制转换是自动的。

head = prepend(head, &adz_info);

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

【讨论】:

  • 做到了。 掌心
  • @WizKiz M.M 在说什么,我想,因为adz_info 是在堆栈上分配的,当preload_adz 返回时,它的内存将自动被垃圾回收。由于它被附加到全局head,这将使head 指向一个已释放的内存块; a dangling pointer。你必须使用堆内存,malloc
  • 它没有分配; C 标准在C11/6.2.4p1 中有一个非常具体的“已分配”定义。此外,C 标准没有定义 堆栈。您可能的意思是具有自动存储持续时间的对象 不能转换为指针(有关“自动存储持续时间”的定义,请参阅C11/6.2.4p5,以及请注意,存储持续时间与解决方案几乎无关,因此我的 strike)。
  • @Seb C 标准术语与一些领域的常用术语不同......通常说“已分配”表示标准描述为 storage 的内容,“动态分配”的意思是标准所称的已分配。 IMO 在这种情况下尝试让每个人都皈依是一个失败的原因
猜你喜欢
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多