改变C代码输出

aTJ*_*aTJ 5 c

我在我的系统中尝试了代码.这就是我得到的...... 1)

    #include <stdio.h>

    int main()
    {
        //int a = 10;
        printf("%s");
        return 0;
    }

Output:
1í^áäðPTRhh
Run Code Online (Sandbox Code Playgroud)

2)

    #include <stdio.h>

    int main()
    {
        int a = 10;
        printf("%s\n");
        return 0;
    }

Output:
__libc_start_main
Run Code Online (Sandbox Code Playgroud)

我在另一个系统(diff编译器)中尝试过.而且产出不同.实际上它必须打印堆栈中最顶层的值.那y到处都不是唯一的?

Seb*_*olm 9

您正在处理未定义的行为,因此您不能指望它是一致的,也不会在编译器,体系结构甚至同一程序的运行之间遵循任何类型的模式.


Oli*_*rth 7

因为编译器可以自由地安排堆栈的内容,但他们喜欢.此外,无论发生什么"在堆栈的顶部"将被解释printf()为指针; 在相应的存储位置可能存在任何随机垃圾.


Abi*_*Abi 7

在printf语句中,您指定了格式说明符%s,这意味着要打印字符串.它将检查堆栈的顶部并打印堆栈顶部的字符串

堆栈排列完全依赖于编译器

__libc_start_main()函数应执行任何必要的执行环境初始化,使用适当的参数调用main函数,并处理从main()返回并位于堆栈顶部的返回.这就是你得到的输出