enum type{tA,tB};
struct a{
    char *a1;
    int a2;
    int a3;
};
struct b{
    char *b1;
    float b2;
};
union c{
    a c1;
    b c2;
};
struct d{
    int d1;
    c   d2;
    tpye d3;
}
//----我这样写代码,下
void xyz(a value,type tvlue)
{
  d *m;
  if((m=(d *)malloc(sizeof(d)))==NULL)//尤其是这里对吗??
  {
      printf("内存分陪错误!")
      return 0;
  }
  switch(tvlue)
  {
      case tA:
      memcpy(m->d2.c1,value,sizeof(m->d2.c1));//尤其是这里对吗??
      break;
      case tB:
      memcpy(m->d2.c2,value,sizeof(m->d2.c2));//尤其是这里对吗??
      break;
  }
}
main(...)
{
...
    a h;type k;
    h.a1=100;
    h.a2="hello";
    h.a3=20;
    k=tA;
    xyz(h,k);
...
}
//我这样做对吗??????

解决方案 »

  1.   

    main(...)
    {
    ...
        a h;type k;
        h.a1="hello";
        h.a2=100;//a2和a1的服值应该翻过来
        h.a3=20;
        k=tA;
        xyz(h,k);
    ...
    }
      

  2.   

    memcpy(m->d2.c1,value,sizeof(m->d2.c1));//
    ==这段肯定不行。sizeof(m->d2.c1)不是你想要的大小
      

  3.   

    memcpy要求指针作参数,笔误?
      

  4.   

    struct d{
        int d1;
        c   d2;
        type d3;
    };//少了个分号
    //----我这样写代码,下
    void xyz(a value,type tvlue)
    {
      d *m;
      if((m=(d *)malloc(sizeof(d)))==NULL)//一般没错
      {
          printf("内存分陪错误!");
          return;//void不能返回0
      }
      switch(tvlue)
      {
          case tA:
          memcpy(&m->d2.c1,&value,sizeof(m->d2.c1));//改为&
          break;
          case tB:
          memcpy(&m->d2.c2,&value,sizeof(m->d2.c2));//改为&
          break;
      }
      m->d3 = tvlue;//最好加上这行
    }
      

  5.   

    memcpy(m->d2.c2,value,sizeof(m->d2.c2));//尤其是这里对吗??==================================================================
    value 类型为 a
    c2 类类型为 b这样能得到你想要的值吗?如果在默认的对齐字节为8的情况,这样写还存在隐患