使用另一个typedef进行类型转换

时间:2011-07-05 08:07:19

标签: c

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';

5 个答案:

答案 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->esample_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));

类型转换只不过是将一种类型的表达式转换为另一种类型的表达式。但是你似乎试图转换类型本身,它在编译时修改(变量声明)

不清楚尝试这样的事情背后的想法。如果你能说得更清楚,人们就能提供更多的见解