我该如何进行这样的结构类型转换?

时间:2013-10-10 03:07:09

标签: c pointers struct type-conversion

如果我有两种结构类型:

typedef struct
{
   unsigned int * a;
   char * b;
   char * c;
}TYPEA;

typedef struct
{
   unsigned int * a;
   unsigned int * b;
}TYPEB;

我还有一个指针数组,其中包含指向TYPEA类型的指针:

TYPEA* AArray[1] =
{
   &ga,
};

ga定义为:

TYPEA ga =
{
   &num1,
   &b,
   &c,
};

如果我定义了另一个TYPEA var,我可以修改AArray[0]的内容值,如下所示:

TYPEA another_ga =
{
   &num3,
   &b,
   &c,
};

void change_AArray()
{
   *AArray[0] = another_ga;
}

这非常有效,但问题是,TYPEATYPEB的前32位是相同的(两者都是unsigned int),我可以更改{{1 } AArray的内容是ga结构?

以下是我的尝试:

TYPEB

然后我尝试添加另一个指针并将其放在void change_AArray() { /* *AArray[0] = another_ga; */ /* Compile Error */ /* *AArray[0] = gb; */ /* Compile Error */ /* *AArray[0] = (TYPEA)gb; */ /* Passed compile, but AArray[0] is not changed */ /* AArray[0] = (TYPEA*)&gb; */ } 中而不是使用AArray[0],但是它无法通过编译阶段,我认为C在初始化列表中需要一个常量。 / p>

&ga

是否可以进行类型转换?

整个代码:

TYPEA * pga = &ga;
TYPEA* AArray[1] =
{
   pga, // error, needs a constant expression.
};
void change_AArray()
{
   AArray[0] = (TYPEA*)&gb;
}

3 个答案:

答案 0 :(得分:1)

好吧,你可以使用union

union UNION_AB {
  TYPEA a;
  TYPEB b;
};

UNION_AB* UARRAY[1] = { &ua };

答案 1 :(得分:1)

void change_AArray()
{   
   *AArray[0] = *((TYPEA*) &gb);  //#1
   /* error:
   *(AArray[0]) = (TYPEA) gb;     //#2
   */
}

您可以将#1用于您的目的。

如果使用#2,gcc报告错误:
错误:转换为请求的非标量类型

问题是:
- 什么是标量/非标量类型?
- 此错误消息的含义是什么? - 为什么#2失败了?

什么是标量/非标量类型?
int,char,指针是标量类型,结构不是。
请在此处查看详细信息http://herbert.the-little-red-haired-girl.org/en/prgmsc1/docs/part2a.pdf

此错误消息的含义是什么? 如果您在标量和非标量类型之间进行分配,则会出现此错误。

为什么#2失败?
对于*(AArray[0]) = (TYPEA) gb;,双方都是非标量类型。所以,它看起来不应该得到上述错误 但是,C不允许在结构之间进行投射。请参阅http://msdn.microsoft.com/en-us/library/d9f2bsy2.aspx

测试程序,

struct a{ int i;};
struct b{ int i; };

int main (int argc, char *argv[])
{
    struct a aaa;
    struct b bbb;
    bbb = (struct b)aaa;

    return 0;
}

gcc报告错误: error: conversion to non-scalar type requested

总而言之,#2失败的原因是C语言不允许在结构之间进行转换。

答案 2 :(得分:0)

您无法直接投放两种不同类型的struct,您必须指定以下字段:

(*AArray[0]).a = gb.a;