栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用printf的%s说明符打印NULL的行为是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用printf的%s说明符打印NULL的行为是什么?

首先,第一件事

printf
是:期望其%s参数使用有效的(即非NULL)指针,因此将NULL正式传递给它是不确定的。它可能会显示“(null)”,也可能会删除硬盘上的所有文件-
就ANSI而言,这是正确的行为(至少,这是Harbison和Steele告诉我的。)

话虽这么说,是的,这确实是奇怪的行为。事实证明,发生的事情是当您执行以下简单操作时

printf

printf("%sn", NULL);

GCC是( 啊哈 )足够聪明,解构到一个呼叫此

puts
。第一个
printf
,这个:

printf("test %sn", NULL);

非常复杂,以至于gcc会发出对real的调用

printf

(注意,gcc

printf
在编译时会发出有关无效参数的警告。这是因为它很早以前就已经开发出了解析
*printf
格式字符串的功能。)

您可以自己编译该

-save-temps
选项,然后查看生成的
.s
文件,从而自己查看。

当我编译第一个示例时,我得到:

movl    $.LC0, %eaxmovl    $0, %esimovq    %rax, %rdimovl    $0, %eaxcall    printf      ; <-- Actually calls printf!

(评论由我添加。)

但是第二个产生了以下代码:

movl    $0, %edi    ; Stores NULL in the puts argument listcall    puts        ; Calls puts

奇怪的是它不会打印以下换行符。好像已经弄清楚这将导致段错误,所以它不会打扰。(它有它-当我编译它时警告我。)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/400924.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号