int a = 10;
int* pA = &a;
long long b = 200;
long long* pB = &b;
memcpy (pB,pA,4);
memcpy (pB+1,pA,4);
cout<<"I'm a memcpy!: "<<*(pB)<<endl;我正在用memcpy做一些测试来教我自己记忆是如何工作的。我要做的是将b=设置为"1010“。我可以将值从a复制到b,但随后我尝试将内存偏移1字节,并写入另一个10字节,但这不起作用,它只输出"10“。
我需要做什么才能得到1010的值?
发布于 2012-06-14 08:05:27
您的代码目前存在一些问题:
int。因为不能保证int是任何特定的大小,所以在进行这种字节级别的memcpy.memcpy工作之前,您需要确保它至少有4个字节长,但是整数是一系列字节。根据您的目标体系结构,整数中的字节可能会有不同的排列方式(大端、小端等)。在整数上使用memcpy可能会也可能不会执行预期的操作。在学习memcpy和朋友的工作原理时,最好使用字节数组。memcpy使用pB+1作为目标。这并没有使指针前进一个字节,而是前进了sizeof(*pB)个字节。在这种情况下,这会使它指向一个无效的地址(超过变量的末尾)。对memcpy的调用将破坏随机内存,这可能会使程序崩溃或导致不可预测的结果。发布于 2012-06-14 08:30:09
我不认为memcpy()是为你想要的东西而设计的。通常,您可以使用memcpy()来复制一个或多个完整的对象(其中对象可以是整数、字符、long long等)。
int a[4] = { 1, 2, 3, 4 };
int b[3];
int c[5] = { 0 };
::memcpy(b, a, 3 * sizeof(int)); // b is { 1, 2, 3 }
::memcpy(c+2, b, 3 * sizeof(int)); // c is { 0, 0, 1, 2, 3 }c+2不是"c +2字节“。它是"c +2int“(在Win32/x86系统上是8字节)。
您可以通过强制转换为char或unsigned char指针来访问单个字节,但我不建议这样做,除非您真正了解自己在做什么,因为这有很多陷阱。
unsigned x = 0;
unsigned char *px = reinterpret_cast<unsigned char *>(&x);
px[0] = 0xFF;
px[2] = 0xAA;这里的一个危险是你假设你知道计算机是如何存储整数的。在x86系统上,x将是0x00AA00FF,但在Sun Sparc系统上,它将是0xFF00AA00。
如果你需要设置整数的各个部分,最好使用"or“和"shift”。
x = (0xFF<<24) | (0xAA<<8);将在任何架构上为您提供0xFF00AA00。0xFF<<24将值0xFF左移24位,使0xFF000000。0xAA<<8将值0xAA左移8位,使0x0000AA00。
我们“或”他们在一起,给0xFF00AA00。
发布于 2012-06-14 08:03:16
查看指针算法:http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html。将一个值加到一个指针上,实际上会递增那么多个单位,不管你处理的是什么大小。
https://stackoverflow.com/questions/11025029
复制相似问题