如何解决将结构中的空指针转换为结构以访问成员
我正在编写一个函数来从动态块数组中删除一个数据块 在这里我找到了我要删除的特定块,指向它的指针是 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 指针,只需命名您的结构并将 last
和 next
声明为指向您的结构的指针:
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 举报,一经查实,本站将立刻删除。