2011-01-12 7 views
5

私のシステムでコードを試しました。これは多彩なCコード出力

#include <stdio.h> 

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

Output: 
__libc_start_main 

が、私は別のシステム(差分コンパイラ)で試してみました 1)

#include <stdio.h> 

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

Output: 
1í^áäðPTRhh 

2)......私が得たものです。そして出力は異なっていた。 実際には、スタックの一番上の値が印刷されている必要があります。それでは、yはどこでもユニークではありませんか?

+0

OSは32ビットと64ビットですか?それはメモリ管理の問題かもしれません – Sudantha

+1

@Sudantha:これはメモリ管理と何が関係していますか? –

+2

@Sudantha:OSは32ビットですが、影響があるかどうかはわかりません。 .. – aTJ

答えて

7

printfステートメントで、書式指定子%sを指定しました。これは文字列を出力することを意味します。これは、スタックの先頭をチェックし、

スタック配置が

__libc_start_main()関数は、実行環境のいずれかの必要な初期化を実行するものと完全にコンパイラに依存しているスタックの一番上に存在する文字列を印刷し、メイン関数を呼び出します適切な引数を付けてmain()からの戻り値を処理し、それはスタックの先頭にあった。そして、それは出力として得られたものです

+1

-1:質問に答えません。そして、なぜあなたは10を見ると思いますか? –

+0

@ Oli:答えが変更されました。それを確認してください – Abi

7

コンパイラはスタックの内容を自由に並べ替えることができます。また、「スタックの最上部にある」ものが何であれ、ポインタとしてprintf()と解釈されます。対応する格納場所にランダムなジャンクが存在する可能性があります。

9

あなたはundefined behaviorを扱っていますので、それが一貫しているとは思えませんし、コンパイラ、アーキテクチャ間、あるいは同じプログラムの実行でもパターンを追うことはできません。