我不理解同事使用的函数。他不能 他正在使用奇怪的返回块。
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;
如果这是我想做的,后者正是我会写的。 将其全部压缩到一个表达式中会使人类更难阅读和理解代码,并且不会传达任何抵消优势。
但是,您的特殊情况更糟。 在您的情况下,p
和tmp
是函数的局部变量,因此对它们的赋值对调用方没有影响。 因此,如果之后不会读回新值(从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。他需要在字符指针上进行指针运算,因此他需要使其成为字符。不需要第二个作业