关于void*转换成结构体指针类型的错误,高手帮忙

zhiyajun11 2011-05-02 06:01:51
#include <stdio.h>
#include <string.h>
typedef struct _abc{
int c;
char b;
} ABC, *PABC;

void main(void)
{
void * a;
a=malloc((unsigned)6);
( (PABC)a )->c=5;

}

上面的程序中,在调试环境下查看(PABC)a的值,总是bad type cast。
难道void* 指针不能转换成结构体指针吗?
请高手解释一下,谢谢了!!!!
...全文
626 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xspace_time 2011-05-07
  • 打赏
  • 举报
回复
也许你可以修改定义
typedef struct _abc{
int c;
char b;
} ABC, *PABC;
#include<stdlib.h>
void main(void)
{
struct _abc *a;
a=(_abc*)malloc(6*sizeof(_abc));
a->c=5;
}
这样就很明确
xspace_time 2011-05-07
  • 打赏
  • 举报
回复
对于32位编译器,地址是以4*8=32来表示的,4表示4个字节,默认为unsigned int型,实际上所有地址都可以用一个unsigned int来表示,void *不是没有类型,而是地址长度为unsigned int的类型,可以转换为其它类型,结构体地址也是内存里面的一个地址,长度最高为4个字节,因此void*是可以转换为结构体指针的,但是假如编译器默认将结构体保存在内存地址的低字节位置以方便使用断指针快速取得内容,而且将类型设置为short int类型,那么将一个long int转换为short int是危险的,这意味着可能丢失高位的有用字节,从而在转换后不再是原来的地址,这将造成引该程序用该地址时提示不存在或者无权访问的错误,所以字有些比较苛刻的编译器中是不允许长地址向短地址转换的
wizard_tiger 2011-05-07
  • 打赏
  • 举报
回复
这个应该没错啊!
LZ用的什么编译器。
xmu_才盛 2011-05-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 newstudent_never 的回复:]
引用 9 楼 pathuang68 的回复:
补充说明:8楼的做法是在debug模式下操作的。


( (PABC)a )->c=5;
他这样做不行吗?? 我觉得这个语法没问题。。 都已经给a为结构体类型了, 所以应该可以用了吧?
[/Quote]

我 2008 没报错, 我觉得这个语法是正确的。。 linux 内核下面都是这种东东啊。。
xmu_才盛 2011-05-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pathuang68 的回复:]
补充说明:8楼的做法是在debug模式下操作的。
[/Quote]

( (PABC)a )->c=5;
他这样做不行吗?? 我觉得这个语法没问题。。 都已经给a为结构体类型了, 所以应该可以用了吧?
zhiyajun11 2011-05-02
  • 打赏
  • 举报
回复
我用vc6.0编译就有错,怎么回事。
[Quote=引用 8 楼 pathuang68 的回复:]

引用 6 楼 zhiyajun11 的回复:

编译是没有错误,我是在调试模式下看得。但是你如果使用(PABC)a的话,就会报错。你在调试模式查看(PABC)a的值就知道了。。。
引用 1 楼 kid_coder 的回复:

... vc6没报错

当然不能直接用a->c这种方式来使用了,应该要给a转型为PABC。
我在VS2010下把(PABC)a高亮,然后把鼠标移到高亮区上面……
[/Quote]
pathuang68 2011-05-02
  • 打赏
  • 举报
回复
补充说明:8楼的做法是在debug模式下操作的。
pathuang68 2011-05-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhiyajun11 的回复:]

编译是没有错误,我是在调试模式下看得。但是你如果使用(PABC)a的话,就会报错。你在调试模式查看(PABC)a的值就知道了。。。
引用 1 楼 kid_coder 的回复:

... vc6没报错
[/Quote]
当然不能直接用a->c这种方式来使用了,应该要给a转型为PABC。
我在VS2010下把(PABC)a高亮,然后把鼠标移到高亮区上面,显示的结果很正常的。
zhiyajun11 2011-05-02
  • 打赏
  • 举报
回复
编译是没有错误,我是在调试模式下看得。但是你如果使用(PABC)a的话,就会报错。你在调试模式查看(PABC)a的值就知道了。。。[Quote=引用 2 楼 hnuqinhuan 的回复:]

C/C++ code

#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct _abc
{
int c;
char b;
}ABC, *PABC;

void main(void)
{
void * a;
a=( void *)malloc((unsigned)6);
……
[/Quote]
zhiyajun11 2011-05-02
  • 打赏
  • 举报
回复
编译是没有错误,我是在调试模式下看得。但是你如果使用(PABC)a的话,就会报错。你在调试模式查看(PABC)a的值就知道了。。。
[Quote=引用 1 楼 kid_coder 的回复:]

... vc6没报错
[/Quote]
pathuang68 2011-05-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 stonewomen 的回复:]

lz好像那个结构体的 大小是8吧!!!
[/Quote]
是的,但楼主那样写也是没有问题的。
stonewomen 2011-05-02
  • 打赏
  • 举报
回复
lz好像那个结构体的 大小是8吧!!!
pathuang68 2011-05-02
  • 打赏
  • 举报
回复
VS2010也没有问题
無_1024 2011-05-02
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct _abc
{
int c;
char b;
}ABC, *PABC;

void main(void)
{
void * a;
a=( void *)malloc((unsigned)6);
( (PABC)a )->c=5;
}

//没有错啊
KID_coder 2011-05-02
  • 打赏
  • 举报
回复
... vc6没报错

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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