我在我从事的项目源代码中有此代码段
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/