我不明白为什么数组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如何工作的示例!!
答案 0 :(得分:4)
函数memcpy
复制位,逐字。因此,您将位从整数数组复制到浮点数组:内容与浮点表示匹配的可能性很小。所以你得到的数组中充满了对你的浮点格式没什么意义的东西。
简而言之,在最低级别,1
和1.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;
}
}