typedef struct {
unsigned char a,
unsigned char b,
unsigned char c
}type_a;
typedef struct {
unsigned char e,
unsigned char f[2]
}type_b;
type_a sample;
sample.a = 1;
sample.b = 2;
sample.c = 3;
如何对其进行类型转换并指定新值,如:
sample = (type_b)sample; // syntax error
sample.f[1] = 'a';
答案 0 :(得分:2)
你应该自己尝试一下。
sample = (type_b)sample; /* Can't cast a structure to
another structure. */
sample.f[1] = 'a'; /* sample is still of type type_a,
and doesn't have an `f` field. */
答案 1 :(得分:2)
否 - C类型是静态的,这意味着sample
将始终保持type_a
类型。但是,您可以使用联盟实现您想要的目标:
union {
type_a as_a;
type_b as_b;
} sample;
sample.as_a.a = 1;
sample.as_a.b = 2;
sample.as_a.c = 3;
sample.as_b.f[1] = 'a';
请注意,创建一个像这样的裸union
类型的对象是不常见的;通常,您会在union
中包含struct
,其中包含一个标记,以便您知道该对象目前的类型:
struct {
enum { TYPE_A, TYPE_B } type;
union {
type_a as_a;
type_b as_b;
} data;
} sample;
/* sample is a TYPE_A right now */
sample.type = TYPE_A;
sample.data.as_a.a = 1;
sample.data.as_a.b = 2;
sample.data.as_a.c = 3;
/* sample is now a TYPE_B */
sample.type = TYPE_B;
sample.data.as_b.f[1] = 'a';
答案 2 :(得分:1)
您无法将一种数据类型转换为另一种不兼容的数据类型。但是,内存对你开放。您可以按如下方式访问它:
typedef struct
{
unsigned char a;
unsigned char b;
unsigned char c;
}type_a;
typedef struct
{
unsigned char e;
unsigned char f[2];
}type_b;
type_a sample;
sample.a = 1;
sample.b = 2;
sample.c = 3;
type_b *sample_b = (type_b *) ((void*) &sample);
尝试自己访问sample_b->e
和sample_b->f
,看看会发生什么。
答案 3 :(得分:0)
没有。您可以通过转换指针来实现:value_b = *((value_b*)&value_a)
或通过创建这两种类型的联合。
但是你这样做,要小心。结构可以具有不同的数据对齐,您可能会得到意想不到的结果。
答案 4 :(得分:0)
是的,您可以通过尝试类似
的内容将type_a的值复制到type_b中type_b sample_b = *((type_b *)& sample);
或
的memcpy(&安培; sample_b,&安培;样品,的sizeof(TYPE_A));
类型转换只不过是将一种类型的表达式转换为另一种类型的表达式。但是你似乎试图转换类型本身,它在编译时修改(变量声明)
不清楚尝试这样的事情背后的想法。如果你能说得更清楚,人们就能提供更多的见解