printf( )的一点探索

先看一段代码:

 #include <stdio.h>
 int main(void)
 {
	char s[10] = "jackpot\n";
	printf("%s", s);
	printf("%.1s\n", "hello,world" + 1);
	printf("%s\n", (char *)0xffffffff);
	return  0;
 }

printf中,经常用%s来格式化字符串,那么%s的作用是什么呢?

image

第一个,我们给了s作为参数,即字符串的首地址,结果输出了jackpot

第二个,输出了e,等等,为什么是‘e’?而且我们的参数是“hello,world”+ 1 . 哈哈,对了,输出e是因为我们指定了输出字符串的长度,而且,字符串“hello,world”其实是个地址!!是内存中“hello,world”的首地址,所以我们通过+1可以指向‘e’。

第三个,我们知道printf将指定地址的内容输出,不断输出直到\0为止。还记得字符串以\0结尾吧。所以,当我们输出地址0xffffffff中的内容时,出现了段错误,因为我们非法读取了不可读的段。

以上是printf所具备的一部分特性,%s的作用使得程序可能会遭到格式化字符串攻击。

posted @ 2012-01-22 12:39  universe.ini  阅读(178)  评论(0)    收藏  举报