1

这纯粹是一个家庭作业问题,因为我知道你真的不应该在现实生活中尝试这样做。但我一直在努力解决这个问题。假设我们知道要复制的永久起始位置以及要复制的内存块的确切大小。假设我们的源是从 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 有时如何分配内存感到困惑,所以......

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

4

2 回答 2

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++; }
}

所以是的,它从和开始向上source计数dest

于 2013-01-25T23:32:30.480 回答
0

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

如果您最终为嵌入式系统编写“裸机”类型的无操作系统软件,或者您自己实现操作系统或内核,您可能非常需要这样做。

于 2013-01-25T23:29:54.633 回答