2016-07-02 60 views
-3

我想知道我們是否可以將包含2個浮點變量的結構memcpy包含到另一個包含2個int變量的結構中。這是我目前所知的memcpy ing float into int

struct stFloat 
{ 
float a; 
float b; 
}; 


struct stInt 
{ 
int a; 
int b; 
}; 


int main() 
{ 
struct stFloat aa; 
aa.a=12.234; 
aa.b=673.797; 

struct stInt bb; 

memcpy(&bb,&aa,sizeof(stFloat)); 

printf("%d %d\n",bb.a,bb.b); 

return 0; 
} 

但不幸的是我沒有得到理想的結果。我期待的輸出是但輸出看起來像一些垃圾。有人能幫我解決這個問題嗎?

感謝

+1

你爲什麼期待這樣的結果? –

+0

@Oliver我以爲只有整數部分纔會被複制。 – Harry

+1

'a = b;'不同於'memcpy(&a,&b,...);'。 –

回答

3

整數和浮點有不同的內部表示,和memcpy是一個簡單的按位複製,所以如果你期待在某種程度上它不會發生轉換的數字。

相反,您需要自己做,例如通過聲明一個構造函數或函數或賦值運算符來允許您將stfloats賦值給stint。這也可以讓你明確指出你想要的轉換。

一般來說,使用memcpy是一個糟糕的主意(除此之外,因爲它只適用於POD,並且還因爲您會遇到這種問題)。這是C++中應該避免的一件事情。

+0

@Gujit我不想單獨將每個字段複製到結構體變量中。那麼還有什麼其他方法可以將所有數據直接複製到一行中。 – Harry

+1

@哈里:不,如答案所述。 –

+1

如果您添加了assigment操作符,則可以使用它將所有數據複製到任何位置的單個行中。您只需要花費三條(或多或少)額外的線來定義該賦值運算符。 –

1

不,你不能,你還可以寫一個函數,它會爲你做它:

void cpy(struct stFloat *src, struct stInt *dest){ 
dest->a = (int)src->a; 
dest->b = (int)src->b; 
} 

然後,通過傳送結構由引用指針調用它(否則只會工作在結構的副本上):

struct stFloat f; 
struct stFloat i; 

cpy(&f,&i); 
+0

這些是指針,而不是引用。 –

+0

@LightnessRacesinOrbit:在函數的主體中是的,但是當我們用&來傳遞參數地址時,它不是正確的術語嗎? –

+0

不在C++中,沒有。爲了避免這種情況,最好還是避免使用C語言(在這種語言中它是不明確的)。 –