解释程序的输出
Explain output of program
您可以帮助我解释以下程序的输出:
#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仍然不幸地警告。
相关文章:
- 为什么下面的Hello World程序在PowerShell上没有显示任何输出?同一程序在CMD上显示正确的输出
- 解释程序的输出
- 任何人都可以解释此程序的类型促销以及为什么输出相同
- 如果/else语句未显示/可变分配问题的输出;初学者程序员
- 为C程序获取不同的输出?该程序应该输出什么
- 如何删除模板类的输出操作程序重载的错误
- 无法在Eclipse中编译带有输入和输出的C 程序
- 有人可以解释这个 c++ 程序的输出吗?
- 有人可以解释这个程序如何提供这个输出
- 通过给定输出,程序计算中使用了多少个项
- 解释 C++/SDL2 程序的 valgrind 输出
- 将输出从程序 A 重定向到程序 B 的输入和 viceversa
- 输出正确,但每次打印输出后程序崩溃
- 任何人都可以根据指针解释该程序的输出
- 生成注释以解释C++程序的结构
- 未提供所需输出的程序
- std::cout输出直到程序结束才打印
- 传递程序1的输出作为程序2的输入
- Boost::iostream::copy(), inputstream和outstream输出解释
- 我应该如何将固定进度条添加到生成终端输出的C++程序中(在 Linux 中)