gpt4 book ai didi

c - 我如何在 C 中使用不透明指针?

转载 作者:太空宇宙 更新时间:2023-11-04 05:36:09 25 4
gpt4 key购买 nike

我在网上浏览 C 书,我不明白 6.6 中关于结构指针的内容。我试图在初始化函数中返回指向双向链表的指针,但迷路了。

.h 有一个指向双向链表的不透明指针:

typedef void * d_link_list_t;

.c 实现具有列表结构定义:

    typedef struct list_s
{
node_t * head;
node_t * tail;
int count; //num nodes
} list_t

.c 之后我实现了初始化函数,问题是:

d_link_list_t* Initialize(void)
{
//Converting opaque pointer to real pointer
d_link_list_t* list = (d_link_list_t*)malloc(sizeof(d_link_list_t*));



// Now make concrete list_t pointer and set the members
list_t * rlP;//real list pointer
rlP = (list_t*)malloc(sizeof(list_t));
rlP->head = NULL;
rlP->tail = NULL;
rlP->count = 1;

//cast opaque pointer to real list P PROBLEM HERE
list = (d_link_list_t*)rlP;
list->count = 0; //list IS NOT STRUCT

return list;
}

我想返回 * d_link_list_t ,一个引用链表实例的不透明指针。我希望 implementation.c 中的所有函数都使用 .h 中的这个不透明指针引用的列表。我根本不明白该怎么做。

我尝试将不透明指针强制转换为 list_t 结构指针 - 希望不透明指针指向与结构指针相同的位置,但这似乎是错误的。尝试使用“->”访问计数会出现错误“尝试访问不是结构或 union 的成员‘计数’”

如何使 void Opaque 指针引用我的 list_t 结构?请帮助我!

最佳答案

您的代码有一些问题。首先,d_link_list_t 已经是一个空指针,所以当你定义你的不透明指针时使用

d_link_list_t list; //list is a void pointer

and not

d_link_list_t* list; //list is a pointer to a void pointer.

其次,我认为这段代码

//Converting opaque pointer to real pointer
d_link_list_t* list = (d_link_list_t*)malloc(sizeof(d_link_list_t*));

应该为不透明指针分配空间,但你不需要这样做,正如我之前所说的,只需使用

d_link_list_t list; //list is a void pointer.

第三,当您将真实指针转换为不透明指针时,您还需要在函数末尾调整转换。使用

list = (d_link_list_t)rlP;

代替

list = (d_link_list_t*)rlP;

最后,在最后,您为什么要尝试通过不透明指针访问结构的内容。为什么这样

list->count = 0; //list IS NOT STRUCT

创建不透明指针的整个想法是让用户无法直接访问该结构。如果要访问该结构,请使用真实指针或将不透明指针转换为指向该结构的指针。同样,整个想法是对函数的用户隐藏列表的内部实现。

关于c - 我如何在 C 中使用不透明指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35163022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com