[英]Casting a void pointer in a struct to a struct to access members
我正在写一个 function 从块的动态数组中删除一个数据块在这里我找到了我要删除的特定块,指向它的指针是 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 是 void 指针,因此编译器无法知道它们具有我要访问的字段。 所以你想将它们强制转换为 *DArrBlock。 但是你怎么做呢? 我以为这就是方式
startPos->(*DArrBlock)last->next = startPos->next;
startPos->(*DArrBlock)next->last = startPos->last;
但这会给出错误“base.c:106:15: error: expected identifier before '(' token”
那么如何将结构的 void 指针字段转换为指向结构的指针呢?
我知道可以用这样的中间变量来完成
prev = startPos->last;
next = startPos->next;
prev->next = startPos->next;
next->last = startPos->last;
但我想这会减慢速度,因为您存储了两个新指针。
您不必首先使用 void 指针,只需命名您的结构并将last
和next
声明为指向您的结构的指针:
typedef struct DArrBlock
{
struct DArrBlock *last;
int8_t pos;
void *data;
struct DArrBlock *next;
} DArrBlock;
如果使用 void 指针,则必须正确转换:
((DArrBlock*)startPos->next)->last = ...
至于使用临时变量时的开销 - 任何体面的编译器都会优化它(当不编译时没有优化)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.