【发布时间】:2013-09-13 14:11:45
【问题描述】:
最近的 C 标准指定 printf("%s",p):
如果不存在 l 长度修饰符,则参数应为指向字符类型数组的初始元素的指针
这是否意味着p 必须与char * 兼容,还是应该以更宽松的方式解释这句话?标准的其他部分是否阐明了“字符类型数组”的确切含义?
为什么这很重要:如果该短语被严格解释为意味着 p 必须与 char * 兼容,那么一个重要的结果是 unsigned char *p; … printf("%s", p); 在编译平台上未定义,其中 @ 987654327@ 已签名,const char *p; … printf("%s", p); 未定义。
【问题讨论】:
-
恕我直言,“字符类型数组”可能意味着 ["const", "volatile", ""]["unsigned", "signed", ""]
char。 -
我不明白 const 的重要性,只有
%n修饰符被描述为写入参数之一。 -
@Mat const-ness 可能很重要,因为
const char *不是与char *兼容的类型。没关系,printf()不写在那里。
标签: c pointers printf language-lawyer c11