C - 使用memcpy直接从内存中复制

时间:2013-01-25 23:28:26

标签: c memory memcpy

这纯粹是一个家庭作业问题,因为我知道你真的不应该在现实生活中尝试这样做。但我一直在努力做到这一点。假设我们知道要复制的位置的永久起始位置以及我们想要复制的内存块的确切大小。所以说我们的源是从0x28000到0x2C0000的堆栈。堆栈向下增长,因此我们给出了一个指向堆栈顶部的指针(0x2C0000)。我们想将STACK_SIZE字节复制到第二个堆栈,其顶部为0x30000。基本上是这样的:

                Stack 1            Stack 2
       /--+-------------------+-------------------+--/
          |        ABXLQPAOSRJ|                   |
       /--+-------------------+-------------------+--/
      0x280000           0x2C0000            0x300000
                              ^                   ^
                              |                   |
                         Top of stack 1     Top of Stack 2

如果我们必须使用memcpy,我们必须从0x28000开始吧? (我不完全确定memcpy的读取方向;从较高的地址到较低的地址,反之亦然)这是正确的吗?

void* s = (void *)source_stack_bottom      //where source_stack_bottom is 0x280000 in this case
void* d = (void *)dest_stack_bottom    //which is 0x2C0000
memcpy(d, s, STACK_SIZE)          //STACK_SIZE is just a variable with the stack size

我无法想到为什么它不应该起作用,但是我再次对C如何有时分配内存感到困惑......

编辑::哎呀,变量混乱。现在修好了。

2 个答案:

答案 0 :(得分:1)

memcpy()的简单实现将是这样的:

void naive_memcpy(void *destt, void *sourcet, size_t size)
{
   char *source = (char *)sourcet;
   char *dest = (char *)destt;
   for(size_t s = 0; s < size; s++){ *dest++ = *source++; }
}

是的,它从sourcedest

开始向上计算

答案 1 :(得分:0)

是的,memcpy()从您传递给它的基地址开始计算。

如果您最终为嵌入式系统编写“裸机”无操作系统软件,或者您自己实现操作系统或内核,那么您可能需要做类似的事情。