关于指针强制转换的疑问?

myripc 2007-06-23 10:12:48
如下程序

#include <stdio.h>

struct B
{
int bi;
int bj;
};

struct A
{
struct B b;
int ai;
int aj;
};

main()
{
struct A * pa = NULL;
struct B * pb = NULL;

pa = (struct A *) malloc (sizeof(struct A));

pa->b.bi = 1;
pa->b.bj = 2;
pb = (struct B *) pa;

printf("pb->bi=%d pb->bj=%d \r\n", pb->bi, pb->bj);
}

在VC6上pb = (struct B *) pa;能正确赋值.但是在VC2005运行时,怎么pb还是NULL;

请高手指教,谢谢
...全文
843 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
拿节 2007-06-25
  • 打赏
  • 举报
回复
楼主确定在VS2005有问题吗?
我刚才测试了下!
VC6。0和VS2005结果都是一样的!一点问题没有!
dai_weitao 2007-06-25
  • 打赏
  • 举报
回复
程序写的有问题, 这种转换是很危险的, struct A和B是组合关系而不是继承关系, 没有这样转换的道理.
rainv 2007-06-25
  • 打赏
  • 举报
回复
mark
jixingzhong 2007-06-25
  • 打赏
  • 举报
回复
可行,但是存在隐患 ...
thinkingl 2007-06-25
  • 打赏
  • 举报
回复
C和C++本来就是不一样的.
想不出问题就不要用C++编译C库.
这样做在C++里是禁止的,不管出现什么问题都不要惊讶.
yjgx007 2007-06-25
  • 打赏
  • 举报
回复
Using standard C++ syntax
reinterpret_cast
秋叶1片 2007-06-25
  • 打赏
  • 举报
回复
pb = (struct B *) pa;
改成
pb = (struct B *) &(pa->b);

能行么?
yawer 2007-06-25
  • 打赏
  • 举报
回复
vs2005的vc版本和vc6的版本不一样,你这样直接强制转化会有问题的。应当reinterpret_cast检查一下是不是可以这样转化。因为不同编译器的行为是不一样的。
myripc 2007-06-23
  • 打赏
  • 举报
回复
会不会是字节对齐的问题,造成编译器不能赋值?
myripc 2007-06-23
  • 打赏
  • 举报
回复
我这是举的例子,我的项目是一个开源的C库,用VC2005编译,一直出现该问题.
Avoid 2007-06-23
  • 打赏
  • 举报
回复
编译器帮助你检查出了错误,还不把你乐得?非要让编译器将错就错?
jasonshark 2007-06-23
  • 打赏
  • 举报
回复
我知道, 正因为没有继承关系所以才让你用reinterpret_cast,
至于为什么,我觉得我也讲不清楚,而且跟不同版本编译器的类型检查严格性有关...
你看看static_cast和reinterpret_cast的区别吧
myripc 2007-06-23
  • 打赏
  • 举报
回复
这里不是继承, 其实这里A 的首地址也是B的首地址.怎么不能赋值呢
jasonshark 2007-06-23
  • 打赏
  • 举报
回复
应该是对继承检查更严格的原因
你用reinterpret_cast吧
daidongsheng 2007-06-23
  • 打赏
  • 举报
回复
没有用过2005~很奇怪啊~
achang84 2007-06-23
  • 打赏
  • 举报
回复
的确是内存对齐的问题

struct A
{
int ai;
int aj;
struct B b; // 注意:原文是放在这个结构体开头
};

按照这样修改后输出变成,
pb->bi=-842150451 pb->bj=-842150451
Press any key to continue
ZZCaiKenShin 2007-06-23
  • 打赏
  • 举报
回复
vc6比较落后吧
那时候还没有标准c++标准
vc2005的编译环境要求比较严所以会出错
可能你的那段代码不是标准c++程序

至于哪里不对我也看不出来
王国凡 2007-06-23
  • 打赏
  • 举报
回复
这样虽有隐患, 但仍能输出 pb->bi, pb->bj 的值.
samuellei 2007-06-23
  • 打赏
  • 举报
回复
内存对齐方式不一致!!

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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