2012-04-28 3 views
1

私は下に書かれている小さなプログラムをテストしました。私の質問は、値へのポインタと最初のポインタへのポインタの間に12バイトの違いがある理由です。しかし、他のポインタアドレス?8バイトの唯一の違いは、すべてのtime.I、このプログラムを複数回実行し、常に私は、これは誰もが理由かもしれないものを私に説明しdifference.Can見ている事前に感謝を...ポインタのアドレスの値のバリエーション

#include<stdio.h> 
#include<stdlib.h> 

int main(void) 
{ 
     int val; 
     int *ptr; 
     int **ptrptr; 
     int ***ptrptrptr; 
     int ****ptrptrptrptr; 
     int *****ptrptrptrptrptr; 

     val=10; 
     ptr=&val; 
     ptrptr=&ptr; 
     ptrptrptr=&ptrptr; 
     ptrptrptrptr=&ptrptrptr; 
     ptrptrptrptrptr=&ptrptrptrptr; 

     printf("Value-%d\n",val); 
     printf("Value address - %d\n",ptr); 
     printf("Pointer address - %d\n",ptrptr); 
     printf("Pointer Pointer Address -%d\n",ptrptrptr); 
     printf("Pointer Pointer Pointer Address -%d\n",ptrptrptrptr); 
     printf("Pointer Pointer Pointer Pointer Address -%d\n",ptrptrptrptrptr); 

     return 0; 
} 

結果は以下のとおりです。

Value-10 
Value address - -1308521884 
Pointer address - -1308521896 
Pointer Pointer Address --1308521904 
Pointer Pointer Pointer Address --1308521912 
Pointer Pointer Pointer Pointer Address --1308521920 
+1

ホワイ・コンパイラー、どのリンカー、どのプロセッサー? 32または64ビット? int - とは何ですか?それは本当に重要ですか?あなたはどうやって気づきましたか? –

+1

最初のintをlongに変更することは、あなたが期待している通りに面白いことです。 – strkol

+0

ああ、その長い間働いています... :) – Teja

答えて

4

これは、コンパイラが選択したスタックレイアウトですが、 f.e.それは整列の理由である可能性があります。物事は他のレイアウトではおそらくはうまくいくでしょう。

サイドノート、アドレスを印刷するには%pを使用する必要があります。

+0

はい%pはintアドレスをhexa..hopeに変換しています。正解ですが、それでもスタックの理由は何ですか? – Teja

+0

@Vutukuriスタックレイアウトは石で固定されておらず、標準でもありません。各コンパイラは、ローカル変数の配置方法を自由に選択できます。引数を渡すことは別の話です( 'cdecl'、' stdcall')。 – cnicutar

+0

さて、私はdiffコンパイラで同じプログラムを実行するとdiff結果を得るかもしれないと言っていますか? – Teja

関連する問題