c语言 - 返回值时赋值



我不理解同事使用的函数。他不能 他正在使用奇怪的返回块。

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

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

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

所有 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);
}

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 个字节的地址。 这可能是一些内存管理,您可以在向用户提供内存位置之前将一些数据存储在标头中。

这很容易,但非常不正确,不便携且容易出错。

他将地址提前 16 个字符并返回 A it。他需要在字符指针上进行指针运算,因此他需要使其成为字符。不需要第二个作业

相关内容

  • 没有找到相关文章

最新更新