簡體   English   中英

C-使用memcpy直接從內存復制

[英]C - copying directly from memory using 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有時如何分配內存感到困惑。

編輯::糟糕,變量混亂。 立即修復。

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開始算起

是的, memcpy()從傳遞給它的基址開始計數。

如果最終為嵌入式系統編寫了“裸機”的無操作系統軟件,或者您自己實現了操作系統或內核,那么您可能非常需要做這樣的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM