首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解memcpy

理解memcpy
EN

Stack Overflow用户
提问于 2012-06-14 07:54:34
回答 7查看 12.5K关注 0票数 7
代码语言:javascript
复制
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的值?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-06-14 08:05:27

您的代码目前存在一些问题:

  • 您复制了4个字节,但目标类型为int。因为不能保证int是任何特定的大小,所以在进行这种字节级别的memcpy.
  • memcpy工作之前,您需要确保它至少有4个字节长,但是整数是一系列字节。根据您的目标体系结构,整数中的字节可能会有不同的排列方式(大端、小端等)。在整数上使用memcpy可能会也可能不会执行预期的操作。在学习memcpy和朋友的工作原理时,最好使用字节数组。
  • 您的第二个memcpy使用pB+1作为目标。这并没有使指针前进一个字节,而是前进了sizeof(*pB)个字节。在这种情况下,这会使它指向一个无效的地址(超过变量的末尾)。对memcpy的调用将破坏随机内存,这可能会使程序崩溃或导致不可预测的结果。
票数 9
EN

Stack Overflow用户

发布于 2012-06-14 08:30:09

我不认为memcpy()是为你想要的东西而设计的。通常,您可以使用memcpy()来复制一个或多个完整的对象(其中对象可以是整数、字符、long long等)。

代码语言:javascript
复制
    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指针来访问单个字节,但我不建议这样做,除非您真正了解自己在做什么,因为这有很多陷阱。

代码语言:javascript
复制
    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”。

代码语言:javascript
复制
    x = (0xFF<<24) | (0xAA<<8);

将在任何架构上为您提供0xFF00AA00。0xFF<<24将值0xFF左移24位,使0xFF000000。0xAA<<8将值0xAA左移8位,使0x0000AA00。

我们“或”他们在一起,给0xFF00AA00。

票数 2
EN

Stack Overflow用户

发布于 2012-06-14 08:03:16

查看指针算法:http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html。将一个值加到一个指针上,实际上会递增那么多个单位,不管你处理的是什么大小。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11025029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档