memcpy不复制任何东西?

时间:2012-08-24 08:02:28

标签: c++ c visual-studio-2010

我不明白为什么数组t1为空。据我所知,memcpy不应该关心对象的底层类型。你怎么看? %)

cout << sizeof(float) << sizeof(int) << endl;

float *t1= (float *)malloc(20*sizeof(float));
memset(t1,0x00,20*sizeof(float)); 

int *t2= (int *)malloc(20*sizeof(int));
for (int i=0; i<20; i++) 
    t2[i]=i;  

memcpy(t1,t2,20*sizeof(int));

for (int i=0; i<20; i++) 
    printf("%f\t", (float)t1[i]); 

我知道什么类型的铸造意味着什么。好的,我犯了一些错误。这是粗心大意!

P.S。这是了解memcpy如何工作的示例!!

6 个答案:

答案 0 :(得分:4)

函数memcpy复制位,逐字。因此,您将位从整数数组复制到浮点数组:内容与浮点表示匹配的可能性很小。所以你得到的数组中充满了对你的浮点格式没什么意义的东西。

简而言之,在最低级别,11.0f看起来截然不同。


由于(float)t1[i])已经t1[i],投标float并没有真正做任何事情。

答案 1 :(得分:3)

尽管你的抗议,你的阵列并非“空”。它只有一个非常非常小的值:您的机器使用IEEE754标准来表示浮点数。在该标准中,全零的单词表示值0.0。下一个更大的字(即通过将1添加到基础位获得的字)表示下一个最大的浮点值,这是一个极小的非正规值。当你printf这个值达到标准精度(小数点后6位?)时,它只是舍入到零。

在类似的问题上,这是我的tangentially related answer

答案 2 :(得分:1)

您将整数值0,1,2,3,4,5 .. 20强制转换为浮点数。浮点数和整数使用不同的底层表示,而且我认为这些值非常小并且将打印为0,除非您将格式更改为包含很多精度。

答案 3 :(得分:1)

int和float中的位排列是不同的。即使事情被复制得很好,你也无法理解它。

更改为

for (int i=0; i<20; i++) 
  printf("%d\t", (int)t1[i]);

你会看到复制的东西。

答案 4 :(得分:0)

memcpy将内存复制为字节,并不关心在内存位置存储了哪些基础类型。内存中的整数以不同于浮点数的格式存储,因此基本上以t1结尾的内容可能是但不一定是有效的浮点值。

答案 5 :(得分:0)

由于您使用的是C ++,因此可以使用C ++功能,例如std::vector

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;
int main(){
    cout << sizeof(float) << sizeof(int) << endl;
    std::vector<float> floatVector;
    std::vector<int> intVector;

    for (int i = 0; i < 20; i++)
    {
        intVector.push_back(i);
    }
    floatVector.resize(intVector.size());

    std::copy(intVector.begin(), intVector.end(), floatVector.begin());
    for (int i = 0; i < 20; i++)
    {
        cout << "element[" << i << "]: " << floatVector[i] << std::endl;
    }
}