2015-07-03 41 views
1
#include <stdio.h> 

int main() 
{ 
    int val; 

    printf("blah%p%nblah", &val, &val); 

    printf("val = %d\n", val); 

    return 0; 

} 

该演示程序在32位机器上编译。我认为val应该是8 但我得到这个:printf%n如何计算字符?

$ ./a.out 
blah0xffa9b6fcblahval = 14 

为什么14? blah是4个字符。 IA32中的指针应该是4个字节。 %n什么都不打印。

+1

关闭这个重复的代码似乎是从该答案中获得的,而这个答案已经回答了这个问题。 – Lundin

回答

3

请计数的印刷字符的数目,它们是14

存储在变量int指针的值的"%n"说明符字符的数目印刷"%n"指定符的occurrance之前poitner地址有10个,blah有4个。

blah0xffa9b6fc /* these are exactly 14 characters 
^ ^
    %s  %p 
*/ 
0

该输出串(前会遇到格式说明%N)

blah0xffa9b6fc 

正好包含14个符号。原因VAL包含14是十六进制码

0xffa9b6fc 
在你的平台上指针

事实上格式说明%p输出地址有4个字节大小。:)

3

只是为了支持一下Mr. Iharobhis answer说,

C11报价,章§7.21.6.1,fprintf()(重点煤矿)

n

的参数应该是一个指针,指向符号整数写入的 数由该呼叫到目前为止写入到输出流以 fprintf中的字符到其中。没有参数被转换,但一个被消耗。如果规范转换 包含任何标志,字段宽度或精度,则行为为 未定义。

所以,格式字符串,相反,实际印刷字节数字节。

也就是说,推荐的签名main()int main(void)