关于 void 类型指针的使用,高手进~
我定义了2个结构体
typedef struct a{
int i;
int j;
int k;
struct a *p_next;
}A;
typedef struct b{
char ch;
struct b *p_next;
}B;
这两个结构体是用来实现两个链表的节点
现在我想编写一个释放链表空间的程序
freeList(void * p){
//这里面利用p-> p_next,来释放链表的节点
}
问题:
是否可以像上面那样实现一个函数,对不同节点链表的释放?
(因为这两种结构体都有p_next成员,而释放程序中不设计其他)
可以或不可以,都讲一些理由,我好理解一下。
谢谢大家了~
[解决办法]
void 有p_next这个成员吗?
[解决办法]
不可以的吧,void指针不可以直接用的,要转换成其他相应的类型的指针才可以用的.
[解决办法]
必须知道指针类型才能使用
[解决办法]
有C不可以做的吗? :)
参考
typedef struct node_s {
struct node_s * p_next;
} node_t;
typedef struct a_node_s {
struct a_node_s * p_next;
int i;
int j;
int k;
} a_node_t;
typedef struct b_node_s {
struct b_node_s * p_next;
char ch;
} b_node_t;
void freeList (node_t *p)
{
// free ops.
}
a_node_t * a_hdr;
b_node_t * b_hdr;
freeList ((node_t*) a_hdr);
freeList ((node_t*) b_hdr);
保持 p_next成员在struct里的位置就可以了。
其实Java, Python里的对象模型就是这样做的, 楼主干的不赖。
[解决办法]
1
能不能在 freeList(void * p)函数,加一个参数
void freeList(void * p, unsigned char node_type)
{
swtich(node_type)
{
case 12: freeList_A((A* )p);break;
case 8: frseeList_B((B*)p);break;
default:break;
}
}
void freeList_A(A* p)
{
}
void freeList_B(B* p)
{
}
void main()
{
freeList(head, sizeof(*head));
}