void * 问题

「已注销」 2010-03-02 10:01:30
按照书上写了一个queue,但是存放的数不一定,有int也有struct。
所以想到了用void *实现。
现在QElemType用define 定义成void,报错。如果改成int就可以运行。
Status DeQueue(LinkQueue *Q, QElemType *e)
{
if(Q->front == Q->rear)
return ERROR_Queue;
QueuePtr p = Q->front->next;
*e = *(p->data);
free(p->data);
Q->front->next = p->next;
if(Q->rear == p)
Q->rear = Q->front;
free(p);
return OK;
}

可是报错。
queue.c: In function 'DeQueue':
queue.c:50: warning: dereferencing 'void *' pointer
queue.c:50: warning: dereferencing 'void *' pointer
queue.c:50: error: invalid use of void expression

请问如何修改
...全文
332 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wesleyluo 2010-03-03
  • 打赏
  • 举报
回复
学习下!!!!!!!!!!!!
cattycat 2010-03-03
  • 打赏
  • 举报
回复
对void*类型解引用的时候需要类型转换。
*e = *(p->data);
这里需要进行类型转换。
不知名小ITer 2010-03-03
  • 打赏
  • 举报
回复
在需要进行解引用的地方,用强制转换.
东大坡居士 2010-03-03
  • 打赏
  • 举报
回复
typedef enum
{
DT_INT = 0,
DT_FLOAT=1,
DT_DOUBLE=2
}DataTypeEnum;

//
Status DeQueue(LinkQueue *Q, QElemType *e,DataTypeEnum dataType)
{
if(Q->front == Q->rear)
return ERROR_Queue;
QueuePtr p = Q->front->next;
if(dtatType == DT_INT)
//*e = *(p->data);
*(int *)e = *(((int *)p)->data);
free(p->data);
Q->front->next = p->next;
if(Q->rear == p)
Q->rear = Q->front;
free(p);
return OK;
}
arong1234 2010-03-03
  • 打赏
  • 举报
回复
我想楼主是在一个程序里同时支持int或者double,而不是分别支持吧
引用 7 楼 ccnyou 的回复:
typedef DatType int;//或double
arong1234 2010-03-03
  • 打赏
  • 举报
回复
无论你用宏还是typedef还是模板,只要你最后转化出来的指针类型是void*你就不可以用*ptr来解引用。原因很简单,系统不知道void指向什么,所以他不知道给你多少内存。楼主这个设计本身就不可能做到正确

在C语言里,你应该用一个包含类型信息的结构来保存这种数据,下面结构应该满足你要求

typedef enum
{
DT_INT = 0,
DT_FLOAT=1,
DT_DOUBLE=2
}DataTypeEnum;
typedef struct
{
DataTypeEnum type;
union
{
int iValue;
float fValue;
double dValue;
}data;
}DataStruct;
ccnyou 2010-03-03
  • 打赏
  • 举报
回复
typedef DatType int;//或double
「已注销」 2010-03-03
  • 打赏
  • 举报
回复
那遇到这种情况,一个队列要存储int 或者是double 或者是自定义变量的时候
在c里面要如何实现
ccnyou 2010-03-02
  • 打赏
  • 举报
回复
回LZ:typedef,是定义变量后,安照此变量内存格式定义新变量,而define则是字符替换,特别是定义指针,会(易)出错
「已注销」 2010-03-02
  • 打赏
  • 举报
回复
就是用的void *
c里面用不了模板
请问3楼具体什么意思啊
ccnyou 2010-03-02
  • 打赏
  • 举报
回复
自定义类型用typedef!二者(与define)有本质区别!
zwicker 2010-03-02
  • 打赏
  • 举报
回复
干什么不直接用void*

用template来实现这个更好吧
「已注销」 2010-03-02
  • 打赏
  • 举报
回复
typedef struct QNode
{
QElemType *data;
struct QNode *next;
}QNode, *QueuePtr;

typedef struct
{
QueuePtr front; //pointer to the head of the queue
QueuePtr rear; //pointer to the rear of the queue
}LinkQueue;

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧