Сколько памяти требуется для представления адреса? - PullRequest
4 голосов
/ 11 марта 2012

Рассмотрим следующий фрагмент кода.

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

Ответы [ 2 ]

4 голосов
/ 11 марта 2012

Ты не.Для указателей возможно - если маловероятно - чтобы указатели имели более высокие требования к хранилищу, чем любое целое число.Если есть подходящий целочисленный тип, то для него будет typedef std::intptr_t (и, возможно, также std::uintptr_t), определенный в <cstdint> (только C ++ 11).

Вы можете проверитьна наличие intptr_t на этапе препроцессора, проверяя определенность макроса INTPTR_MAX (или INTPTR_MIN) после #include <cstdint>.

Если вы просто хотите напечатать значение указателя, используя std::cout, затем вы можете привести к void* (необязательно для int*, но необходимо для char*) и использовать << напрямую без приведения к целочисленному типу.

3 голосов
/ 11 марта 2012

Вы можете использовать assert (или другой вид проверки). Чек должен быть в форме

assert (sizeof (& var) <= sizeof (long)); </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...