首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言指向内容不确定的结构体如何用指针实现

2013-07-04 
C语言指向内容不确定的结构体怎么用指针实现比如有两个结构体typedef struct Msg1{int afloat bint c}M

C语言指向内容不确定的结构体怎么用指针实现
比如有两个结构体
typedef struct Msg1
{
   int a;
   float b;
   int c;
}M1;
typedef struct Msg2
{
   char a[20];
   int b;

}M2;
一个函数执行完毕后可能返回Msg1或Msg2结构体,怎么让返回值用指针实现指向不定结构体? C 指针 struct
[解决办法]
用void*返回,用的时候再强制转换即可,例如M1* p = (M1*)fun();
[解决办法]
转换成void*返回,不过要想确认返回的是哪个个类型,必须还有加标识,可以参考以下两种方法
(1)可设置一个全局变量,在返回的函数内对于返回不同的结构类型,设置不同的标识,
(2)在每个结构体内,最开始部分加一个字节,用于标识它本身
[解决办法]


typedef struct Msg1
{
   int a;
   float b;
   int c;
}M1;
typedef struct Msg2
{
   char a[20];
   int b;

}M2;

typedef struct Msg
{
    int tag;//区分使用的是哪个结构体
    union
    {
        M1 m1;
        M2 m2;
    };
}Msg;

[解决办法]
#include <stdio.h>
#include <string.h>
typedef struct Msg1 {
   int a;
   float b;
   int c;
} M1;
typedef struct Msg2 {
   char a[20];
   int b;
} M2;
void *fun(int *t) {
    static M1 m1;
    static M2 m2;
    static a=2;
    a=3-a;
    *t=a;
    if (a==1) {
        m1.a=1;
        m1.b=0.5f;
        m1.c=2;
        return &m1;
    } else {//a==2
        strncpy(m2.a,"abcdefghijklmnopqrstuvwxyz",19);(m2.a)[19]=0;
        m2.b=3;
        return &m2;
    }
}
int main() {
    M1 *p1;
    M2 *p2;
    int i,f;
    void *pv;

    for (i=0;i<2;i++) {
        pv=fun(&f);
        if (f==1) {
            p1=(M1 *)pv;
            printf("p1->a==%d,p1->b==%g,p1->c==%d\n",p1->a,p1->b,p1->c);


        } else {//f==2
            p2=(M2 *)pv;
            printf("p2->a==%s,p2->b==%d\n",p2->a,p2->b);
        }
    }

    return 0;
}
//p1->a==1,p1->b==0.5,p1->c==2
//p2->a==abcdefghijklmnopqrs,p2->b==3

热点排行
Bad Request.