2016-07-02 136 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语言(在这种语言中它是不明确的)。 –