关于printf的法律论据的几个问题("%s",......)

Meh*_*dad 6 c printf abi variadic-functions

我正在创建一个修改过的printf实现,我不确定这些问题的答案.

  1. 零是否作为空字符串工作?(被printf("%s", 0)允许吗?)

    我猜不是,因为0是一个int.但是这会引发这个问题:

  2. 是否NULL作为空字符串?(被printf("%s", NULL)允许吗?)

    从逻辑上讲,我认为它应该是肯定的,因为它NULL意味着指针; 但是很多实现似乎都有#define NULL 0,所以我觉得在实践中可能没有.哪个是对的?

  3. 指针类型是否必须指向char?(被printf("%s", (void const *)"")允许吗?)

    我的猜测是类型并不重要,但我不确定.

R..*_*R.. 8

情况1是未定义的行为,因为argument(int)的类型与format specifier(char *)所需的类型不匹配.

出于同样的原因,案例2是未定义的行为.NULL允许被定义为值为0的任何整数常量表达式,或者这样的表达式转换为(void *).这些类型都不是char *,因此行为未定义.

出于同样的原因,案例3是未定义的行为.""产生一个指向以null结尾的字符数组(字符串)的有效指针,但是当你将其强制转换为时const void *,它不再具有匹配格式字符串的正确类型.因此行为是不确定的.

  • 根据6.2.5.27节,"指向void的指针应具有与指向字符类型的指针相同的表示和对齐要求."类似地,指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求. " 它始终将`void*`转换为`char*`,因此#3有效.#2仍然无效,但原因不同. (3认同)