Формат Cout для указателя - PullRequest
       4

Формат Cout для указателя

4 голосов
/ 01 апреля 2012

Я хочу преобразовать этот код c в код c ++. Речь идет об указателе printf

int n = 44;
//printf("n   = %d \t &n = %x\n", n, &n);
cout<<"n ="<<n<< "\t" <<"&n ="<<hex<<int(&n)<<endl;

Когда я запускаю вывод printf так:

   n=44   &n=22ff1c

Но когда я запускаю вывод cout, он выглядит так:

   n=44 &n=22ff0c

Почему две версии выводят разные значения для адреса n?

Ответы [ 3 ]

11 голосов
/ 01 апреля 2012

Компилятор помещает переменную, выделенную для стека, в другое место в разных версиях программы.

Попробуйте включить обе версии printf и cout в одну и ту же программу, чтобы они работали с одинаковым указателем. Тогда вы увидите, что две версии ведут себя одинаково.

int n = 44;
printf("n   = %d \t &n = %x\n", n, &n);
cout<<"n ="<<n<< "\t" <<"&n ="<<hex<<int(&n)<<endl;

Как правильно указывает мистер Листер, вы должны использовать строку формата% p при печати указателей в printf.

1 голос
/ 01 апреля 2012

Вы не контролируете, где n находится в памяти. Компилятор может изменить расположение вещей в зависимости от других вещей, которые кажутся несвязанными. Это не имеет значения. Вы не имеете права говорить, куда n должен идти; что-то еще может быть там, где вы хотите его поместить.

0 голосов
/ 01 апреля 2012

Предполагая, что вы не имеете в виду различия между пробелами. Адрес, в котором n размещен в стеке, отличается при каждом запуске программы. В противном случае все это выглядит нормально для меня!

...