2011-07-05 139 views
-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; 

鑄字變量我如何強制轉換並分配如新價值:與其他類型定義

sample = (type_b)sample; // syntax error 
sample.f[1] = 'a'; 
+0

沒有理由,如果你的問題已經是「我可以做XXX:」不嘗試自己。如果你準備好了這個例子,你爲什麼不運行它?如果你問「我該怎麼做」或「是否合法」,情況會有所不同。 –

+0

也許我應該改變我的問題「可以這樣做」。我已經知道這是一個語法錯誤。對不起,煽動你的bejesus – freonix

+0

這確實是一個區別。一般來說,避免是/否問題在forums + co上不是壞事。 –

回答

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看看會發生什麼。 value_b = *((value_b*)&value_a)或通過創建這兩種類型的工會:

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. */ 
0

號你可以通過轉換指針做到這一點。

但是你這樣做,要小心。結構可以有不同的數據對齊方式,您可能會得到意想不到的結果

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型這樣的;通常你會包括structunion,包括標籤,讓你知道什麼類型的對象是在目前的時間:

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

是的,你可以通過嘗試類似的TYPE_A的值複製到TYPE_B

TYPE_B sample_b = *((* TYPE_B)&樣品);

的memcpy(& sample_b,&樣品,的sizeof(TYPE_A));

鑄字只不過是一個類型的表達式轉換爲另一個。但你似乎想要轉換的類型本身,它是固定在編譯時(變量聲明)

它不清楚背後試圖像這樣的想法。如果你能更清楚,人們將能夠提供更多的見解