2016-08-25 7 views
8

私はC言語を学習し始めました(ポインタは分かります)。C言語におけるポインタの値

#include <stdio.h> 
#include <string.h> 

int main (int argc, char* argv[]) 
{ 
    char c = 'c'; 
    char* cptr = &c; 

    printf("c = %c\n", c); 
    printf("*cptr = %c\n", *cptr); 
    printf("c address = %p\n", &c); 
} 

私の出力は次のとおりです:私は10進数の上進数を変換すると

c = c 
*cptr = c 
c address = 0x7fff0217096f 

は、私が手:140720994002157件の

私の質問:

私はこのコードを持っています

1)この10進値はメモリアドレスを表しますか?あまりにも大きすぎますか?

2)ポインタの値(つまり、c変数のアドレス)を10進数で表示するにはどうすればよいですか?

+6

をあなたのポインタの値が「大きすぎる」であると考えているのはなぜ? – EOF

+0

@EOFまあ、140720994002157ビットは約1750GBに等しいですよね? – padawanTony

+9

これは仮想アドレスであり、コンピュータのRAM容量を反映していません。 –

答えて

7

大きすぎる[アドレス]はありませんか?

これは仮想アドレスであり、数値が物理メモリのバイトの連続番号を表すとは限りません。さらに、異なるプロセスは、それぞれがその個々のアドレス空間を有するので、同じ仮想アドレスで異なるデータを保持することができる。

ポインタの値を整数形式で印刷するにはどうすればよいですか?

整数値としてポインタを表すために使用uintptr_t、その後、PRIuPTRマクロ使用して印刷:

#include <stdio.h> 
#include <inttypes.h> 

int main(void) { 
    char c = 'x'; 
    char *p = &c; 
    uintptr_t x = (uintptr_t)p; 
    printf("Pointer as decimal: %"PRIuPTR"\n", x); 
    return 0; 
} 

Demo.

+0

ありがとうございます。適切なリンクとデモを使用する場合+1。しかしこれについては 'これは仮想アドレスであり、その数値は必ずしも物理メモリのバイトの連続番号を表すとは限りません。 '、物理メモリに連続したバイト数をどのように出力できるか尋ねたいですか? – padawanTony

+2

@padawanTonyユーザーがアクセスできない仮想メモリから物理メモリにマッピングすることはできません。 –

+1

@padawanTonyこれはオペレーティングシステムとそれが実行されているハードウェアの組み合わせによってプログラムから隠されたものなので、特定のアドレスと物理アドレスのマッピングを得るためのOSに依存しない方法はありません。ページ(アロケーションブロック)には特別な順序がないため、物理アドレスはOS仮想メモリマネージャのコンテキスト外では無意味です。 – dasblinkenlight

2

1)。アドレスはprintf("c address = %p\n", &c);としてください。これでポインタ変数自体が格納されているアドレスを表示しようとしましたが、これはおそらくあまり意味がありません。

64ビットアドレスを仮定すると、有効なアドレスである可能性があります。

2)。あなたは安全にポインタアドレスを格納するのに十分な大きさであることが保証され整数に変換する必要があります:

#include <inttypes.h> 

printf("c address = %" PRIuPTR "\n", (uintptr_t)&c); 
+0

1)これは私がやっていることです2)はい、正しい結果(140723639717279)が得られますが、140723639717279は約1750GBに相当します。私は確かにそれほど記憶がありません!どうしたの? – padawanTony

+0

@padawanTonyは上記のように、それは[仮想メモリ](https://en.wikipedia。org/wiki/Virtual_memory)、実際の物理アドレスではありません。 x86_64の実装では、[標準アドレス](https://en.wikipedia.org/wiki/X86-64#Canonical_form_addresses)を使用することがあります。これは2つのエンド –

+0

@ Luuから来ますが、十分なRAMがあれば、なぜ仮想アドレスを使用しますか? – padawanTony

関連する問題