将结构中的空指针转换为结构以访问成员
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;
但我想这会减慢速度,因为您存储了两个新指针。
您不必一开始就使用空指针,只需命名您的结构并将 last
和 next
声明为指向您的结构的指针即可:
typedef struct DArrBlock
{
struct DArrBlock *last;
int8_t pos;
void *data;
struct DArrBlock *next;
} DArrBlock;
如果你使用空指针,你必须正确转换:
((DArrBlock*)startPos->next)->last = ...
至于使用临时变量时的开销 - 任何体面的编译器都会optimize that away(在没有优化的情况下不编译)
我正在编写一个函数来从动态块数组中删除数据块 在这里我找到了我要删除的特定块,指向它的指针是 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;
但我想这会减慢速度,因为您存储了两个新指针。
您不必一开始就使用空指针,只需命名您的结构并将 last
和 next
声明为指向您的结构的指针即可:
typedef struct DArrBlock
{
struct DArrBlock *last;
int8_t pos;
void *data;
struct DArrBlock *next;
} DArrBlock;
如果你使用空指针,你必须正确转换:
((DArrBlock*)startPos->next)->last = ...
至于使用临时变量时的开销 - 任何体面的编译器都会optimize that away(在没有优化的情况下不编译)