假设有这么一个struct
struct A
{
    int;
    short;
    double;
    BYTE;
    long;
}
现在我能得到这样一个结构的指针,也知道此结构中变量类型及顺序,但是不知道变量的变量名,如何获得此结构中的各变量的值? 环境vc.net 2003。

解决方案 »

  1.   

    用memcpy,
    原型void *memcpy( void *dest, const void *src, size_t count );
    比如,int a;
    memcpy(&a, &A, 4);  其它的数值依次取,因为类型已知,所以长度你是知道的,
      

  2.   

    转成char*,然后按照长度读取。
      

  3.   

    楼上的都说的很好;
    我也说一个办法;
    再创建一个这样的结构,不过名字不同,而且这次你把变量名都定义好了。这样类型转换下,直接调用就可以了。比较简单;
    如下:
    struct A
    {
        int;
        short;
        double;
        BYTE;
        long;
    }
    我们已经知道 A *p;(注意要满足 p已经有空间了,指好一片内存了) ;
    开始:
    定义
    struct B
    {
        int m_int ;
        short m_short;
        double m_double;
        BYTE m_BYTE;
        long m_long;
    }
    然后
    (B* )p->m_int,(B*)p->m_short 等等 ;
    很方便,只是耗了些定义B的空间而已.但却省了调用函数转换的时间.
    (空间时间向来是这样的关系)希望我没理解错
      

  4.   

    #pragma once
    #pragma pack(1)
    struct ABCcc
    {
    int a;
    short b;
    double c;
    BYTE d;
    long e;
    };
    ABCcc abc={1,2,3.12,'4',5};
    char *c=(char*)&abc;
    CString s;
    double d;
    memcpy(&d, c+sizeof(int)+sizeof(short),sizeof(double));
    s.Format("%.2f",d);
    AfxMessageBox(s);
      

  5.   

    BYTE *pa;
    pa = (BYTE *)&obj;int temp1;
    short temp2;
    double temp3;
    BYTE temp4;
    long temp5;
    memcpy(&temp1, pa, 4);
    memcpy(&temp2, pa+4, 2);
    memcpy(&temp3, pa+8, 8);
    memcpy(&temp4, pa+16, 1);
    memcpy(&temp5, pa+20, 4);
      

  6.   

    1: 同意mptyness(loving~) 的方法,简单,不出错。
    2:char*,然后按照长度读取,此方法如下,注意字节对器必须设为1,要不然,是错的。
    #pragma pack (1) /*指定按1字节对齐*/
    struct A
    {
        int ;
        short ;
        double ;
        BYTE ;
        long ;
    };
    #pragma pack (1) /*指定按1字节对齐*/int a1 = * ( (int *)pByte );
    short b1 = * ( (int *) ( pByte + sizeof(int) ) );
    double c1 = * ( (double *)( pByte+ sizeof(int)+sizeof(short) ) );
    ...依次类推
      

  7.   

    多谢各位的指点。自己归纳一下,并再提点问题:
        方法一:如covsno兄等所说,结构声明时#pragma pack (1)声明按单字节对其。访问结构时按成员顺序及类型依次偏移对应长度访问。
        问题:结构声明所属的模块是已经成型的模块,我不能修改,只能调用。而且按单字节对齐会影响结构内存访问时的寻址效率,偏偏我要处理的结构比较大而且数量多...    方法二:emptyness(loving~)兄的方法很好,简单不易出错也不用考虑字节对齐的问题。
        问题:我要处理多个结构的数据,而且结构的类型可能将来还要扩展,所以要在运行期间动态的声明并创建结构。可以做得到么,如何动态声明结构呢?(结构的成员构成可以在运行期间获得)    方法三:动态的结构成员访问。其实我可以得到结构的声明和成员名,但由于我的模块中需要处理很多结构,而且要做到可扩展,所以不能写诸如结构指针->成员名这样的代码来访问结构数据。为了达到可扩展的要求,考虑将结构的构成信息写在一个配置文件中,运行时读入配置文件确定结构构成,再对结构数据进行访问。
        问题:配置文件中可以包含结构的成员名,但运行时我动态的得到成员名,如何使用这个成员名去访问结构的对应成员呢。
        比如有这样一个结构
    struct A
    {
        int nValue;
        double dValue;
        BYTE cValue;
        long lValue;
    }
        运行期间我得到A的指针,从配置文件得到A有"nValue"、"dValue"、"cValue"、"lValue"成员名,如何使用这些成员名去访问A的对应成员呢?
      

  8.   

    晕,用memcpy有什么不好呢,各位能否解释一下,标准C函数。
      

  9.   

    晕,用memcpy有什么不好呢,各位能否解释一下,标准C函数。
    ===========================
    编译器不同,结构字节对齐长度有别。而用单字节对齐影响寻址效率。我是这么理解的
      

  10.   

    重新理解下你的问题:
    有一个模块A,里面定义了一个结构,A能向你提供 结构指针,但是你只知道他的成员构成而不知道名字。并且这个A你无法改动,但是它又有可能更新版本,那时候里面的成员构成又会变,所以在我的模块B内预先定义一个结构来转换是不可以的,因为不兼容A的更新的。按上述理解,我觉得不大可能了。如下:
    (结构的成员构成可以在运行期间获得) 这个就不大现实了,也许是我孤陋寡闻。
    平常我们定义一个可以随机快速查找成员的变量,结构也好,数组也好,在C中都需要编译器预先知道内存大小然后进行分配。如果在运行期间才能确定结构的,至少是肯定做不到随机快速访问,也即定义出一个结构是不大可能的(除非能想出一些很怪巧的方法),只能通过指针和内存操作来获得数据。但是后者又关系到原先A中结构所采用的内存字对齐方式的问题。又说好不能对A作改动。。所以应该想办法让A的对齐和你是一样的,或者你知道是怎么对齐的。否则应该是不可解的或者很难解的。
       
    本人对内存分配的问题思考过不多,动态分配也没怎么思考过,更没思考过 动态定义。所以爱莫能助了。唯一能说的就是:此路不通,换条路,不一定要开辟此路。想想有没有其他访问方式能满足你的要求。联系下A模块的作者进行讨论。
    学识有限,无能,现丑了。
      

  11.   

    emptyness(loving~)的方法很好啊,我一直这样用的,名字本来就是无所谓的
    用memcpy把数据拷过去,自然影射到各种变量数据.
    我就经常重定义一些系统的结构,只要结构长度一样,都没问题