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