您尚未登录。

#1 2011-08-23 19:57:27

cuihao
所在地: USTC, Hefei
注册时间: 2011-08-19
帖子: 1,223
个人网站

printf %s NULL指针

尝试用%s输出空指针:

#include <stdio.h>
int main (void)
{
    printf("%s\n", NULL);
    return 0;
}

clang:

cuihao@cuihao-arch /tmp $ clang test.c
cuihao@cuihao-arch /tmp $ ./a.out
(null)

pathcc:

cuihao@cuihao-arch /tmp $ pathcc test.c 
cuihao@cuihao-arch /tmp $ ./a.out
(null)

gcc:

cuihao@cuihao-arch /tmp $ gcc test.c 
test.c: 在函数‘main’中:
test.c:5:5: 警告:对空指针指向内容的读操作(实参 2) [-Wformat]
test.c:5:5: 警告:格式 ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘void *’ [-Wformat]
cuihao@cuihao-arch /tmp $ ./a.out
[1]    5428 segmentation fault  ./a.out

g++:

cuihao@cuihao-arch /tmp $ g++ test.c 
test.c: 在函数‘int main()’中:
test.c:5:24: 警告:格式 ‘%s’ expects argument of type ‘char*’, but argument 2 has type ‘long int’ [-Wformat]
cuihao@cuihao-arch /tmp $ ./a.out
(null)

貌似除了gcc,都输出“(null)”,这是什么道理?


Site: CVHC.CC   Twitter: @cuihaoleo   Org: LUG@USTC
AD:  ~欢迎参与志愿计算~

离线

#2 2011-08-23 21:04:58

cjxgm
忙,却还想养猫?
所在地: 杭州
注册时间: 2011-08-19
帖子: 417
个人网站

Re: printf %s NULL指针

我编译时没有警告耶……

离线

#3 2011-08-23 22:34:03

cuihao
所在地: USTC, Hefei
注册时间: 2011-08-19
帖子: 1,223
个人网站

Re: printf %s NULL指针

仔细看了一下,G++的提示说:

but argument 2 has type ‘long int’

为啥是long int呢  :em04


Site: CVHC.CC   Twitter: @cuihaoleo   Org: LUG@USTC
AD:  ~欢迎参与志愿计算~

离线

#4 2011-08-24 12:01:43

cjxgm
忙,却还想养猫?
所在地: 杭州
注册时间: 2011-08-19
帖子: 417
个人网站

Re: printf %s NULL指针

cuihao 说:

仔细看了一下,G++的提示说:

but argument 2 has type ‘long int’

为啥是long int呢  :em04

在 32bit/64bit 机器上,long int = long = int = 32bit,在 32bit CPU的 16bit 模式下 int = 16bit, long int = long = 32bit
于是乎,为了兼容性,指针都被定义为 long int

离线

#5 2011-08-27 23:20:51

tusooa
论坛版主
注册时间: 2011-08-21
帖子: 138
个人网站

Re: printf %s NULL指针

如果printf ("(null)\n");那就是都是null了。。

离线

#6 2011-08-28 08:24:56

cuihao
所在地: USTC, Hefei
注册时间: 2011-08-19
帖子: 1,223
个人网站

Re: printf %s NULL指针

tusooa 说:

如果printf ("(null)\n");那就是都是null了。。

:em38 好智慧啊


Site: CVHC.CC   Twitter: @cuihaoleo   Org: LUG@USTC
AD:  ~欢迎参与志愿计算~

离线

#7 2011-12-05 00:54:08

ffwalle
机器人
注册时间: 2011-12-03
帖子: 393

Re: printf %s NULL指针

gcc
直接段错误
不知道LZ的gcc什么版本?

clang
(null)

这个依赖具体的libc实现。


just for fun :-)

离线

#8 2011-12-10 10:39:38

koc
会员
注册时间: 2011-08-20
帖子: 132
个人网站

Re: printf %s NULL指针

cuihao 说:
tusooa 说:

如果printf ("(null)\n");那就是都是null了。。

:em38 好智慧啊

让我想起了骗分导论


我的个人小站:https://elephantus.moe
求来访。

离线

#9 2011-12-12 00:09:25

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,919
个人网站

Re: printf %s NULL指针

	.file	"a.c"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	andl	$-16, %esp
	subl	$16, %esp
	movl	$0, (%esp)
	call	puts
	movl	$0, %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (GNU) 4.6.2 20111125 (prerelease)"
	.section	.note.GNU-stack,"",@progbits

看清楚了,调用的是 puts

离线

#10 2011-12-12 10:41:00

ffwalle
机器人
注册时间: 2011-12-03
帖子: 393

Re: printf %s NULL指针

百合仙子 说:

puts

你优化了吧


just for fun :-)

离线

#11 2011-12-12 14:09:38

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,919
个人网站

Re: printf %s NULL指针

walle 说:
百合仙子 说:

puts

你优化了吧

木有啊,我除了 -S 什么参数也木有加,也木有加相关环境变量。

离线

#12 2011-12-15 23:10:34

ffwalle
机器人
注册时间: 2011-12-03
帖子: 393

Re: printf %s NULL指针

百合仙子 说:
walle 说:
百合仙子 说:

puts

你优化了吧

木有啊,我除了 -S 什么参数也木有加,也木有加相关环境变量。

那你指定-O0试试


just for fun :-)

离线

#13 2011-12-15 23:32:51

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,919
个人网站

Re: printf %s NULL指针

walle 说:
百合仙子 说:
walle 说:

你优化了吧

木有啊,我除了 -S 什么参数也木有加,也木有加相关环境变量。

那你指定-O0试试

没有改变。依旧 call puts。

离线

#14 2011-12-16 22:08:03

ffwalle
机器人
注册时间: 2011-12-03
帖子: 393

Re: printf %s NULL指针

百合仙子 说:
walle 说:
百合仙子 说:

木有啊,我除了 -S 什么参数也木有加,也木有加相关环境变量。

那你指定-O0试试

没有改变。依旧 call puts。

那奇怪了,编译器本来在无优化下是不能搞这些小聪明的。你试试把printf的参数写复杂一些,比如%s%d%c%f,....复杂一些 :em27


just for fun :-)

离线

页脚