我在我的系统中尝试了代码。这就是我得到的...... 1)
#include <stdio.h>
int main()
{
//int a = 10;
printf("%s");
return 0;
}
Output:
1í^áäðPTRhh
2)
#include <stdio.h>
int main()
{
int a = 10;
printf("%s\n");
return 0;
}
Output:
__libc_start_main
我在另一个系统(diff编译器)中尝试过。而且产出不同。 实际上它必须打印堆栈中最顶层的值。那y到处都不是唯一的?
答案 0 :(得分:9)
您正在处理undefined behavior,因此您不能指望它是一致的,也不会在编译器,体系结构甚至运行相同程序时遵循任何模式。
答案 1 :(得分:7)
因为编译器可以自由地安排堆栈的内容,但是他们喜欢。此外,无论发生什么“在堆栈的顶部”将被printf()
解释为指针;在相应的存储位置可能有任何随机垃圾。
答案 2 :(得分:7)
在printf语句中,您指定了格式说明符%s,这意味着要打印字符串。它将检查堆栈的顶部并打印堆栈顶部的字符串
堆栈排列完全依赖于编译器
__libc_start_main()函数必须执行任何必要的执行环境初始化,使用适当的参数调用main函数,并处理从main()返回并位于堆栈顶部的返回。这就是你得到的输出