我在我从事的项目源代码中有此代码段

void func(void **p,size_t s)
{
    *p = malloc(s+sizeof(size_t));
    *(((size_t *)(*p))++) = s;
}


而gcc-4.7不会编译它。 gcc返回

lvalue required as increment operand


错误信息。我把它改成了

stp = ((size_t *)(*p));
*(stp ++) = s;




stp = ((size_t *)(*p));
*stp = *stp + 1;
*stp = s;


gcc编译它们两者。但是应用程序无法正常工作。
转换是真的吗?有转换工具吗?

最佳答案

想法似乎是分配一定数量的内存(s)和额外的数量来存储分配的大小,该大小与前导块位于同一区域,然后将指针返回到刚存储的大小后面。

所以试试这个:

void func(void ** p, size_t s)
{
  size_t * sp = malloc(s + sizeof s);
  if (NULL != sp)
  {
    *sp = s;
    ++sp;
  }

  *p = sp;
}


顺便说一句,释放分配的内存,不是直接的。

典型的调用序列(也释放该函数返回的内容)将如下所示:

void * pv = NULL;
func(&pv, 42);
if (NULL != pv)
{
  /* Use 42 bytes of memory pointed to by pv here. */

  free(((char *) pv) - sizeof (size_t));
}

关于c - 转换旧的C代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30761256/

10-11 15:23