微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将结构中的空指针转换为结构以访问成员

如何解决将结构中的空指针转换为结构以访问成员

我正在编写一个函数来从动态块数组中删除一个数据块 在这里我找到了我要删除的特定块,指向它的指针是 startPos startPos 是以下类型的结构体。

typedef struct
{
    void *last; 
    int8_t pos; 
    void *data; 
    void *next; 
} DArrBlock; 

last 和 next 是指向其他 DArrBlocks 的经典链表指针。 要删除特定块,我认为最简单的方法是这样的:

startPos->last->next = startPos->next; 
startPos->next->last = startPos->last; 
free(startPos); 

显然这不起作用,因为 next 和 last 是空指针,因此编译器无法知道它们具有我要访问的字段。所以你想将它们转换为 *DArrBlock。但是你怎么做呢? 我以为是这样

startPos->(*DArrBlock)last->next = startPos->next; 
startPos->(*DArrBlock)next->last = startPos->last; 

但这给出了错误“base.c:106:15: error: '(' token”之前的预期标识符

那么如何将结构的空指针字段转换为指向结构的指针?

我知道可以用这样的中间变量来完成

prev = startPos->last; 
next = startPos->next; 
prev->next = startPos->next; 
next->last = startPos->last; 

但我想这会大大减慢速度,因为您存储了两个新指针。

解决方法

您不必首先使用 void 指针,只需命名您的结构并将 lastnext 声明为指向您的结构的指针:

typedef struct DArrBlock
{
    struct DArrBlock *last; 
    int8_t pos; 
    void *data; 
    struct DArrBlock *next; 
} DArrBlock;

如果你使用 void 指针,你必须正确转换:

((DArrBlock*)startPos->next)->last = ...

至于使用临时变量时的开销 - 任何体面的编译器都会 optimize that away(在没有优化的情况下不编译时)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。