如下程序#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;请高手指教,谢谢

解决方案 »

  1.   

    应该是对继承检查更严格的原因
    你用reinterpret_cast吧
      

  2.   

    我知道, 正因为没有继承关系所以才让你用reinterpret_cast,
    至于为什么,我觉得我也讲不清楚,而且跟不同版本编译器的类型检查严格性有关... 
    你看看static_cast和reinterpret_cast的区别吧
      

  3.   

    我这是举的例子,我的项目是一个开源的C库,用VC2005编译,一直出现该问题.
      

  4.   

    这样虽有隐患, 但仍能输出 pb->bi, pb->bj 的值.
      

  5.   

    vc6比较落后吧
    那时候还没有标准c++标准
    vc2005的编译环境要求比较严所以会出错
    可能你的那段代码不是标准c++程序至于哪里不对我也看不出来
      

  6.   

    的确是内存对齐的问题struct A
    {
    int ai;
    int aj;
    struct B  b;   // 注意:原文是放在这个结构体开头
    };按照这样修改后输出变成,
    pb->bi=-842150451 pb->bj=-842150451
    Press any key to continue
      

  7.   

    程序写的有问题, 这种转换是很危险的, struct A和B是组合关系而不是继承关系, 没有这样转换的道理.
      

  8.   

    楼主确定在VS2005有问题吗?
    我刚才测试了下!
    VC6。0和VS2005结果都是一样的!一点问题没有!
      

  9.   

    vs2005的vc版本和vc6的版本不一样,你这样直接强制转化会有问题的。应当reinterpret_cast检查一下是不是可以这样转化。因为不同编译器的行为是不一样的。
      

  10.   

    pb = (struct B *) pa;
    改成
    pb = (struct B *) &(pa->b);能行么?
      

  11.   

    Using standard C++ syntax 
    reinterpret_cast
      

  12.   

    C和C++本来就是不一样的.
    想不出问题就不要用C++编译C库.
    这样做在C++里是禁止的,不管出现什么问题都不要惊讶.