Rob*_*rtS 0 c pointers casting void
在我是否转换了 malloc 的结果?据说,您不需要强制转换函数或其家族成员之一的返回void指针malloc(),因为标准可以省略它,这可能会导致一些问题。
但是void一般来说,指针的转换呢?与投射void指针的一般方法有什么不同吗?
void指向另一类型的指针,一般用C?void指针吗?有两种正确的情况您需要进行演员表:
将指向 void 的指针转换回其原始非 void 类型而不将结果分配给变量(分配包括初始化,或将其作为参数传递)。
使愚蠢的编译器静音,该编译器会发出有关缩小转换的警告。C11/C18 附件一:
在许多情况下,实现可能会产生警告,但本国际标准中没有规定任何一种情况。以下是一些比较常见的情况。
[...]
- 遇到隐式收缩转换,例如将 long int 或 double 赋值给 int,或将指向 void 的指针指向指向除字符类型(6.3)以外的任何类型的指针。
对于第一部分:您几乎总是可以使用临时变量。例如,您可以编写
int comparator(const void *a, const void *b)
{
int sa = ((const struct foo *)a)->bar;
int sb = ((const struct foo *)b)->bar;
return (sa > sb) - (sa < sb);
}
Run Code Online (Sandbox Code Playgroud)
或者
int comparator(const void *a, const void *b)
{
const struct foo *sa = a;
const struct foo *sb = b;
return (sa->bar > sb->bar) - (sa->bar < sb->bar);
}
Run Code Online (Sandbox Code Playgroud)
- 它们的按键次数几乎相同。
对于第二种情况,您只需要避免使用此类编译器或尝试使用某些开关关闭这种唠叨。
除此之外,问题是,“我是否应该在不需要的地方使用演员表”。有很多东西在 C 程序中不是必需的,但为了清楚起见而添加了。例如缩进或换行!添加它们使事情变得更加清晰。问题是malloc为例如from 的返回值添加无用的强制转换是否使其更具可读性:
char *foo = malloc(42);
Run Code Online (Sandbox Code Playgroud)
对比
char *foo = (char *)malloc(42);
Run Code Online (Sandbox Code Playgroud)
即使没有强制转换,结果也应该转换为char *或至少转换为结果不是很明显foo吗?