您能帮我解释一下以下程序的输出吗?
#include<stdio.h>
int main()
{
char *str;
str = "%s";
printf(str, "Hello K\n");
getchar();
return 0;
}
输出:
Hello K
我的解释:
语句printf(str, "Hello K\n");
被printf("%s" , "Hello K\n");
替换,因此输出为Hello K
。这是正确的吗?
答案 0 :(得分:3)
是的,这是正确的。
str
是一个变量,它代表使用字符串文字可以实现的目标。
但是,请注意它应该是const char*
— const
很重要,因为它可以确保您不会尝试修改字符串文字的内容(非法!)。从C ++ 11开始,这是由该语言强制执行的,尽管我认为GCC和Clang仍然只是发出警告。
答案 1 :(得分:3)
首先,此代码为C。
其次,格式字符串如何工作?
当您调用一个函数(用我所知道的任何一种语言)时,您会在堆栈上分配参数,然后调用该函数初始化基本指针和堆栈指针并开始运行。
像printf
这样的格式字符串函数会根据参数的数量和顺序计算出正确的字符串偏移量。
因此,当解析第一个参数时,无论它来自代码中的局部变量,还是来自.data
部分的常量字符串,它都会寻找%
字符,并为每个字符相对地计算正确参数的地址。
要证明这一点,请尝试仅将printf
与一个参数一起使用:"%s"
,您会在scrren上看到一些值,这是堆栈中第二个参数应具有的位置是。真的很酷的东西,我们称之为 Format-String-Attack