2012-03-11 9 views
4

次のコードを検討してください。アドレスを表すにはどれくらいのメモリが必要ですか?

int var; 

cout << (long)&var; 

私の疑問は、私たちがlong int型が&varで示されるメモリ位置を保持するのに十分な幅を持っていることを知っている方法です。十分でない場合はどうすればよいですか?

私が実行しています完全なコード...

//: C03:YourPets2.cpp 
// From Thinking in C++, 2nd Edition 
// Available at http://www.BruceEckel.com 
// (c) Bruce Eckel 2000 
// Copyright notice in Copyright.txt 
#include <iostream> 
using namespace std; 

int dog, cat, bird, fish; 

void f(int pet) { 
    cout << "pet id number: " << pet << endl; 
} 

int main() { 
    int i, j, k; 
    cout << "Address size " << sizeof(&f) << endl; 
    cout << "Long size " << sizeof(long) << endl; 
    cout << "Intptr size " << sizeof(intptr_t) << endl; 
    cout << "f(): " << &f << endl; 
    cout << "f(): " << (long)&f << endl; 
    cout << "f(): " << (long long)&f << endl; 
    cout << "dog: " << (long)&dog << endl; 
    cout << "cat: " << &cat << endl; 
    cout << "bird: " << &bird << endl; 
    cout << "fish: " << (long)&fish << endl; 
    cout << "i: " << (long)&i << endl; 
    cout << "i: " << (long long)&i << endl; 
    cout << "j: " << (long)&j << endl; 
    cout << "k: " << (long)&k << endl; 
} ///:~ 

私は取得しています結果:

Address size 4 
Long size 4 
Intptr size 4 
f(): 1 
f(): 134514548 
f(): 134514548 
dog: 134521044 
cat: 0x804a0d8 
bird: 0x804a0dc 
fish: 134521056 
i: -1074729380 
i: -1074729380 
j: -1074729384 
k: -1074729388 
+0

C++ 11では、ポインタ値を保持できることが保証されている ''の 'std :: intptr_t'を使用することができます。それはC99で初めて導入されました。 –

答えて

4

あなたはしません。ポインタが任意の整数より大きな記憶域要件を持つ可能性はありますが、そうは考えられません。適切な整数型がある場合は、()と定義されているstd::intptr_t(可能でもstd::uintptr_t)のtypedefが存在します(C++ 11のみ)。

あなたは#include <cstdint>後マクロINTPTR_MAX(又はINTPTR_MIN)の定義済みかを試験することによって、プリプロセッサ段階でintptr_tの存在について試験することができます。

あなただけstd::coutを使用してポインタ値を印刷したい場合は、あなたが(int*にとって不要けどchar*するために必要な)void*にキャストすることができますし、整数型へのキャストせずに直接<<を使用しています。

+1

もっと興味がある。 int型ではなくchar型には型変換が必要なのはなぜですか? – bubble

+0

@bubble: 'ptr'が' char * '型であるときに 'cout << ptr'を使うと、ポイント先のアドレスを表示するのではなく、ヌルで終了する文字列として扱うでしょう。 – interjay

+0

、なぜintptr_tとuintptr_tがあるのでしょうか?私は署名と署名なしを意味する?負のメモリアドレスを持つのは正しいですか? – bubble

3

あなたがアサート(または小切手の異なる種類)を使用することができます。 チェックフォーム

アサート(のsizeof(& VAR)< =用のsizeof(長い))でなければなりません。

+0

あなたはあらかじめ何か言葉を言う方法がないのですか? – bubble

+0

私は、単にマシンの構成を知っていることを意味します。 RAMサイズ、ワードサイズなど。 – bubble

+0

このアサートは、x86-64のMSVC++では失敗します。だから、それは解決策ではありません。 – interjay

関連する問題