#include <stdio.h>
int main()
{
int val;
printf("blah%p%nblah", &val, &val);
printf("val = %d\n", val);
return 0;
}
该演示程序在32位机器上编译。我认为val
应该是8。
但我得到了这个:
$ ./a.out
blah0xffa9b6fcblahval = 14
为什么14? blah
是4个字符。 IA32中的指针应为4个字节。 %n
什么都不打印。
答案 0 :(得分:3)
请计算打印字符的数量,它们是14。
存储在int
指针的变量"%n"
指针中的值是"%n"
说明符出现之前打印的字符数,有10表示poitner地址,4表示blah
。
blah0xffa9b6fc /* these are exactly 14 characters
^ ^
%s %p
*/
答案 1 :(得分:3)
仅支持Mr. Iharob中his answer所说的内容,
引自C11
,章节§7.21.6.1,fprintf()
,(强调我的)
n
参数应该是一个指向有符号整数的指针,其中写有 到目前为止,通过此调用来写入输出流的字符数 fprintf中。没有参数被转换,但是消耗了一个参数。如果转换 规范包括任何标志,字段宽度或精度,行为是 未定义。
因此,不计算格式字符串中的字节数,而不是实际打印字节数。
尽管如此,main()
的推荐签名是int main(void)
。
答案 2 :(得分:0)
此输出字符串(在遇到格式说明符%n之前)
blah0xffa9b6fc
恰好包含14个符号。 val包含14的原因是格式说明符%p
以十六进制表示法输出地址
0xffa9b6fc
确实在您的平台中,指针的大小为4个字节。:)