所以我正在研究一个小的内存分配包,我希望指针的初始化能够保存分配的空间大小,以及通过我的一个函数分配的指示器(在内存大小之前是字符‘q’)所以,我试着做了以下几点:

int qmem_alloc(unsigned num_bytes, void ** rslt){
  *rslt = malloc(num_bytes+sizeof(int)+sizeof(char));
  *((int*)rslt) = num_bytes;
  *(char*)(rslt+sizeof(int)) = 'q';
  rslt = rslt+sizeof(int) + sizeof(char);
  if(*rslt == NULL)
    return -1;
  else if(errno != 0){
    //Catch the rest of the errors
    return -2;
  }
  return 0;
}

然而,在我的主函数中,rslt地址前的内存似乎不包含它被传回后应该包含的内容我改变指针地址有什么不好的地方吗?

最佳答案

你在一些地方失去了某种程度的间接性在取消引用之前使用rslt的任何地方都应该使用*rslt

int qmem_alloc(unsigned num_bytes, void ** rslt){
  *rslt = malloc(num_bytes+sizeof(int)+sizeof(char));
  if(*rslt == NULL)
    return -1;

  *((int*)*rslt) = num_bytes;
  *(char*)(*rslt+sizeof(int)) = 'q';
  *rslt = *rslt+sizeof(int) + sizeof(char);
  if(errno != 0){
    //Catch the rest of the errors
    return -2;
  }
  return 0;
}

此外,malloc返回的内存在任何情况下都是正确对齐的因为您返回的sizeof(int)+sizeof(char)==5字节(假设4字节int)意味着您返回的指针可能不是您需要至少再添加3个字节,以便将返回的缓冲区放在8字节的边界上。

10-08 18:04