格式化字符串随笔

addr%k$s

上这个格式为什么是这样呢?

是格式化字符为什么这样?

%k$s:s代表输出的是字符串,k代表是第几个参数;

https://www.anquanke.com/post/id/180009

具体的来说,是输出栈中存储地址所指向的字符串

%n:将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置,如%100x10$n表示将0x64写入偏移10处保存的指针所指向的地址(4字节),而%$hn表示写入的地址空间为2字节,%$hhn表示写入的地址空间为1字节,%$lln表示写入的地址空间为8字节,在32bit和64bit环境下一样。有时,直接写4字节会导致程序崩溃或等候时间过长,可以通过%$hn或%$hhn来适时调整。

但是:这样获取的是相对于格式化字符串的第k个参数

首先,对于%k$s这一个,表示将相对于格式化字符串的第k个参数以%s形式输出。

正常情况下,一个printf函数格式为


像上面那样,格式化字符串是第一个参数,a是第二个参数,。。。。

什么叫相对于格式化字符串第k个参数呢?

当程序运行时,到printf函数时看一下堆栈图:

源程序是这样的:

而 printf("%08x.%08x.%08x.%s\n", a, b, c, s);堆栈图是这样的


可以看到,这样就是相对于格式化字符串的第k个参数。

原话是这样的

那么为什么要addr%k%s呢?

先插入一个小知识:

对于上面的例子,在进入 printf 函数的之前 (即还没有调用 printf),栈上的布局由高地址到低地址依次如下

我们可以看到,在没有call printf之前栈上的地址就是这样了。


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容