如果我有两种结构类型:
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;
}
这非常有效,但问题是,TYPEA
和TYPEB
的前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;
}
答案 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;