返回值时分配

时间:2019-01-30 15:04:56

标签: c malloc realloc

我不了解我的同事使用的功能。他不能 他正在使用奇怪的返回块。

block_t *get_block(void *p)
{
    char *tmp;
    tmp = p;
    return (p = tmp -= 16);
}

他说应该返回表格和地址。

需要一些帮助来了解退货!非常感谢:)

3 个答案:

答案 0 :(得分:4)

所有C运算符都会计算值(以void为目标类型的强制转换运算符或返回void的函数的函数调用除外)。特别是,赋值和操作/赋值运算将评估为赋值。因此,此语句:

    return (p = tmp -= 16);

等同于

    tmp -= 16;
    p = tmp;
    return p;

如果我想这么做的话,后者正是的写法。将所有内容压缩为一个表达式会使代码更难于人类阅读和理解,并且丝毫没有抵消优势。

但是,您的情况更糟。在您的情况下,ptmp是函数的局部变量,因此对其的分配对调用者没有影响。因此,如果以后不会再从p中读取新值,则没有必要向p分配新值。这可能反映也可能不反映编程错误。如果该函数的实际行为按原样是正确的,那么我将以不同的方式编写整个函数:

block_t *get_block(void *p) {
    return (block_t *) (((char *) p) - 16);
}

答案 1 :(得分:0)

return没什么特别的。就像在任何其他地方一样,它只是一个表达。

您可以将其重写如下:

block_t *get_block(void *p)
{
    char *tmp = p;
    p = tmp - 16;
    return p;
}

block_t *get_block(void *p)
{
    char *tmp = p;
    tmp -= 16;
    p = tmp;
    return p;
}

block_t *get_block(void *p)
{
    char *tmp = p;
    tmp -= 16;
    return (block_t *)tmp;
}

从该函数返回后,return语句中的赋值无效。

它的作用基本上是在您提供的地址之前计算16个字节的地址。 这可能是某种内存管理,您可以在其中将一些数据存储在标题中,然后再分配给用户内存位置。

答案 2 :(得分:-1)

这很容易,但是非常不正确,不便于移植并且容易出错。

他将地址提前16个字符并返回A。他需要对char指针进行指针算术运算,因此需要将其设为char。不需要第二次分配