解释程序的输出

Explain output of program

本文关键字:输出 解释程序      更新时间:2023-10-16

您可以帮助我解释以下程序的输出:

#include<stdio.h>
int main()
{
    char *str;
    str = "%s";
    printf(str, "Hello Kn");
    getchar();
    return 0;
}

输出:

Hello K

我的解释:

语句printf(str, "Hello Kn");printf("%s" , "Hello Kn");取代,因此输出为Hello K。这是正确的吗?

首先,此代码为C。第二,格式字符串如何工作?当您调用函数(以我所知的任何语言(时,您会在堆栈上分配参数,然后调用函数,该函数将基础和堆叠指针进行Intial并开始运行。格式字符串像printf一样函数,根据参数的编号和顺序计算右字符串的偏移。

因此,当解析第一个参数时,它是否形成代码中的本地变量,还是从.data节中的常数字符串 ,它寻找% chars,并且对于每个chars,它都会计算出每个chars相对地址为正确的参数。

要证明这一点,请尝试将printf与一个参数一起使用:"%s",您会在Scrren上看到一些值,这是第二个参数应该是堆栈中的位置。真的很酷的东西,我们称其为格式 - 弦攻击

是的,这是正确的。

str是一个变量,可以用字符串字面的字符串来实现。

但是,请注意,应该是const char*&mdash;const很重要,因为它可以确保您不会尝试修改字符串文字(非法!(的内容。由于C 11这是通过语言强制执行的,尽管我相信GCC和Clang仍然不幸地警告。