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

Casting a void pointer in a struct to a struct to access members

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

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

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

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: 错误:'(' 令牌之前的预期标识符

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

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

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

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

您不必一开始就使用空指针,只需命名您的结构并将 lastnext 声明为指向您的结构的指针即可:

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

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

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

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