C++ 解释程序的输出
你能帮我解释一下以下程序的输出吗C++ 解释程序的输出,c++,C++,你能帮我解释一下以下程序的输出吗 #include<stdio.h> int main() { char *str; str = "%s"; printf(str, "Hello K\n"); getchar(); return 0; } 我的解释: 语句printf(str,“Hello K\n”)替换为printf(“%s”,“Hello K\n”)
#include<stdio.h>
int main()
{
char *str;
str = "%s";
printf(str, "Hello K\n");
getchar();
return 0;
}
我的解释:
语句printf(str,“Hello K\n”)代码>替换为printf(“%s”,“Hello K\n”)因此,输出是Hello K
。这是正确的吗?是的,这是正确的
str
是一个变量,表示用字符串文字可以实现的功能
但是,请注意,它应该是const char*
,const
非常重要,因为它可以确保您不会试图修改字符串文本的内容(非法!)。由于C++11是由语言强制执行的,尽管我相信GCC和Clang仍然只是不幸地发出警告。首先,这段代码是C。
其次,格式字符串是如何工作的?
当你调用一个函数(用我所知道的任何语言)时,你在堆栈上分配参数,然后调用一个函数,该函数初始化基指针和堆栈指针并开始运行。
格式化字符串函数,如printf
根据参数的数量和顺序计算右字符串的偏移量
因此,在解析第一个参数时,无论它是来自代码中的局部变量,还是来自.data
部分的常量字符串,它都会查找%
字符,并相对地计算每个字符到右参数的地址
为了证明这一点,请尝试使用printf
和一个参数:“%s”
,您将在scrren上看到一些值,这是堆栈中第二个参数应该出现的位置。非常酷的东西,我们称之为格式字符串攻击str=“%s”代码>不是有效的C++,因此不应该编译。这实际上看起来更像是一个普通的C程序。什么不清楚?VTT的后续回答:你应该写const char*str=“%s”
这个练习的目的还不清楚,如果要在屏幕上打印“Hello K”,你可以做std::cout@VTT:很遗憾,除非你有-Werror
Hello K