需要了解printf的行为

时间:2015-10-17 17:35:20

标签: c

1)

int main()
{
  printf("%s",5+printf("I see you"));
  return 0;
}

输出::我看到你了

db2 force application (<agentid>)

输出::运行时崩溃

1)为什么两种情况都是不同的行为?

2)有人可以解释为什么“清醒”不会在第一个PRINTF中打印出来吗?

3)方案1是否依赖于编译器?

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终止字符串打印,这可能甚至不会映射到进程地址空间。