我answered一个question,如果使用了错误的格式说明符,那么代码的行为是未定义的。
在该问题中,OP使用%lu
运算符的sizeof
格式说明符。
printf("%lu \n", sizeof(*"327"));
但是,我得到了一些评论,%lu
而不是UB代码。
那么,sizeof(*"327")
是否属实?
答案 0 :(得分:1)
sizeof
运算符返回size_t
类型。该类型的正确格式说明符是%zu
。
如果您使用%lu
打印size_t
,则可能会有效,也可能无效,具体取决于size_t
是否大于long
。如果size_t
较大,则表示未定义行为,如果行为未明确定义。当然,你无法确切地知道。
最好使用特定于该类型的正确格式说明符。
答案 1 :(得分:1)
Unix系统(差不多?)总是有size_t == unsigned long == uintptr_t
,并且有一个很多的代码依赖于这个事实。
唯一常用的系统是64位Windows,其中unsigned long
是32位但size_t
和uintptr_t
是64位。
(Windows是否支持%zu
中的printf
?)