2011-01-12 63 views
5

我尝试了我的系统中的代码。这是我得到了什么...... 1)不同的C代码输出

#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

操作系统是32位和64位?它可能是内存管理问题 – Sudantha 2011-01-12 09:02:52

+1

@Sudantha:这与内存管理有什么关系? – 2011-01-12 09:03:48

回答

7

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

栈安排是完全编译器依赖性

的__libc_start_main()函数应该执行的执行环境的任何必要的初始化,调用主功能并带有适当的参数,并处理main()的返回结果,它位于堆栈顶部。这就是你得到的输出

7

由于编译器可自由安排堆栈的内容,但他们喜欢。此外,不管发生在“堆栈顶部”,将被printf()解释为一个指针;在相应的存储位置可能会有任何垃圾。

9

你正在处理undefined behavior,所以你不能期望它是一致的,也不能遵循编译器,体系结构甚至同一个程序的任何模式。