通过malloc故意隐藏内存

通过malloc故意隐藏内存,c,pointers,malloc,C,Pointers,Malloc,因此,我正在开发一个小型内存分配包,我希望指针的初始化能够保存所分配空间的大小,以及通过我的一个函数(内存大小之前的字符“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”)分配空间的指示器。因此,我试着做以下几点:

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

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字节边界上。

在函数中,rslt是指针的地址。您不应该修改甚至访问它。如果您试图更改/读取指针指向的地址,则需要使用*rslt。如果尝试修改/读取指针指向的值,则需要使用**rslt


@dbush在代码中描述了上述操作的结果

看来你搞乱了这里的间接层次。例如
*((int*)rslt)=num_字节应该是
*((int*)*rslt)=num_字节谢谢!但我主要还是有问题。。。“printf(“指针大小:%d”,(int*)(p-sizeof(int))”仍在产生分段错误。您没有回过头来看足够远。在缓冲区的大小和开始之间有一个
char
。啊,我花了15分钟来解析这个非常简单和正确的解决方案,但你是对的。谢谢