malloc给出了奇怪的分配内存地址

时间:2018-02-23 13:17:07

标签: c malloc dynamic-memory-allocation

我使用arm-none-eabi-gcc编译我的代码并使用QEMU作为模拟器。一切正常,直到我尝试拨打safe_malloc内的send_no_wait。如果我在这里调用safe_malloc,函数send_no_wait将返回错误的地址,程序将在几个汇编指令中崩溃。 safe_malloc函数在其他地方工作,我的想法可能是内存在某种程度上被破坏了,因为当我在send_no_wait之前评论一些需要内存分配的函数时,send_no_wait再次工作...... < / p>

这是safe_malloc导致崩溃时分配的内存地址。

(gdb) p m
$5 = (msg *) 0x10501 <_vfiprintf_r+1796>
(gdb) p *m
$6 = {pData = 0x10519 <_vfiprintf_r+1820> "U", Status = 1, pBlock = 0x1b440, 
  pPrevious = 0xddef90, pNext = 0x2d0e92a} // pPrevious and pNext should point to 0x0

这是在safe_malloc不会导致崩溃的情况下分配的内存地址(我评论了一些需要内存分配的函数)。

(gdb) p m
$1 = (msg *) 0x1b460
(gdb) p *m
$2 = {pData = 0x1b478 "U", Status = 1, pBlock = 0x1b428, pPrevious = 0x0, pNext = 0x0}

<_vfiprintf_r+1796>是什么意思?这个分配的内存在这里有什么问题吗?

exception send_no_wait(mailbox *mBox, void *pData) {
  volatile uint first_execution = TRUE;
  SaveContext();
  if (first_execution == TRUE) {
    first_execution = FALSE;
    if (mBox->nMessages > 0 &&
        mBox->pHead->Status == RECEIVER) { // receiving task is waiting
      ...
    } else {
      msg *m = safe_malloc(sizeof(msg));
      m->pData = safe_malloc(mBox->nDataSize); 
      memcpy(m->pData, pData, mBox->nDataSize); // copy data to the message
      m->Status = SENDER;
      listobj *node = list_get_head(ready_list);
      m->pBlock = node;
      node->pMessage = m;
      mailbox_push_no_wait_msg(mBox, m);
      // ASYNCHRONOUS, DON'T RESCHEDULE HERE
    }
  }
  return OK;
}

void *safe_malloc(unsigned int size) {
  void *mem = malloc(size);
  mem_counter++;
  return mem;
}

1 个答案:

答案 0 :(得分:0)

我认为您的主要问题是memcpy(m->pData, pData, mBox->nDataSize);,因为它遵循shallow copy概念。尝试用deep copy概念替换。