2011-01-12 85 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,所以你不能期望它是一致的,也不能遵循編譯器,體系結構甚至同一個程序的任何模式。