1)
int main()
{
printf("%s",5+printf("I see you"));
return 0;
}
输出::我看到你了
db2 force application (<agentid>)
输出::运行时崩溃
1)为什么两种情况都是不同的行为?
2)有人可以解释为什么“清醒”不会在第一个PRINTF中打印出来吗?
3)方案1是否依赖于编译器?
答案 0 :(得分:4)
此
printf("%s",fun()+ printf("I see you"));
将fun()
("awake"
字符串文字的地址)的结果添加到调用printf()
的结果中,这是整数值9
,数量为字符打印。这是一个字符地址加上一个整数偏移量 - 完全合法 - 它恰好是"I see you"
字符串文字中的几个字符,因此它打印出`&#34的结尾;我看到你&#34 ;字符串。
此
printf("%s",5+printf("I see you"));
尝试以虚拟内存地址14
处的NUL终止字符串打印,这可能甚至不会映射到进程地址空间。