我刚看到两个面试问题,我无法找到任何令人满意的答案。问题是
有人能解释一下我的答案吗?
提前致谢。
答案 0 :(得分:11)
任何限制都是实现定义的,但标准要求至少为15,见5.2.4.1
与其他条件相同的条件:当它出错时,以及何时不必要。最着名的例子可能是你不应该从malloc
转换返回值。这是毫无意义的[*],它可以隐藏偶尔的错误(忘记#include stdlib.h
)。另一个例子是,如果您在整数类型之间随机分散强制转换,那么最终您将抑制编译器警告缩小强制转换或者有符号和无符号值之间的比较,您应该注意这一点。在您确定代码正确之前,不应放置用于抑制此类警告的强制转换。
[*]我曾经认为有一点,因为我写的东西是:
foo *p = something;
... some time later ...
p = (foo*) malloc(n * sizeof(foo));
使用sizeof
中的错误类型,演员提供了一些防范错误的保护。在视觉上我可以看到转换匹配sizeof
,并且编译器检查变量是否与转换匹配,所以我有安全。
现在我写道:
p = malloc(n * sizeof(*p));
我不需要检查安全性,因为我确实为p的类型分配了正确大小的内存。好吧,假设乘法不会溢出。
答案 1 :(得分:1)
正如另一个答案所指出的那样是实现定义,但是存在可能由大型链产生的问题(尤其是构建时间)。它可能是“code smell”,也表明封装不良。
最简单的答案是“当不需要时”,即自动,例如float to double,int to long(适当时[*])。我也会假设它几乎肯定会询问从void *转换为其他内容,e.g. with malloc(comp.lang.c FAQ item)。
[*]见评论
答案 2 :(得分:1)
2
答案 3 :(得分:0)
嵌套的深度没有限制,但是编译器可能会耗尽堆栈空间......所以这是编译器依赖的!