改变C代码输出

时间:2011-01-12 08:59:42

标签: c

我在我的系统中尝试了代码。这就是我得到的...... 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到处都不是唯一的?

3 个答案:

答案 0 :(得分:9)

您正在处理undefined behavior,因此您不能指望它是一致的,也不会在编译器,体系结构甚至运行相同程序时遵循任何模式。

答案 1 :(得分:7)

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

答案 2 :(得分:7)

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

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

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