2017-01-10 2 views
0

Я пытаюсь узнать о стеке и куче на C++ и только начал печатать тесты, чтобы узнать, как это работает.Получение странных значений для указателя и регулярного int

Я написал этот код:

`#include <iostream> 

using namespace std; 

int main(){ 

int a; 
int b; 
int *c; 
int *c2; 
int *d{new int}; 

cout << &a << " a= " << a << endl; 
cout << &b << " b= " << b << endl; 
cout << &c << " c= " << c << endl; 
cout << &c2 << " c2= " << c2 << endl; 
cout << &d << " d= " << d << endl; 

delete d; 

return 0; 

} 

выход является:

0x7ffefad88d00 а = 124

0x7ffefad88d04 Ь = 0

0x7ffefad88d08 с = 0

0x7ffefad88d10 c2 = 0x 400b20

0x7ffefad88d18 d = 0xec9c20

Есть 3 вещи, которые я не понимаю:

  1. почему значение 124?
  2. Почему значение c равно 0, а не указатель типа c2, который имеет одинаковый синтаксис?
  3. Почему c размер всего 2 байта, а не 4?
+0

Поскольку вы не инициализировали 'a' и triy для печати своего значения, это неопределенное поведение - так что все может случиться. Размер 'int' зависит от компилятора. – doctorlove

+0

спасибо, но я тоже не инициализировал b ... почему он не получил значение complier? – adi319

+0

0 - вполне приемлемое случайное число – doctorlove

ответ

1

a, b, c, d и значение *d не инициализированы, их чтение является undefined behavior. Все может случиться, никто не может предсказать значение этих переменных. См. this question для получения дополнительной информации.

О распечатке указателей, множество реализаций, подвешивающих 0s. См. this question. Если я попытаюсь распечатать значения указателей в Visual Studio 2015, я получаю ведущие нули.

+0

спасибо. Я согласен с частью, но с c? он предположительно является указателем .... – adi319

+0

И? http://stackoverflow.com/questions/7546620/operator-new-initializes-memory-to-zero – doctorlove

0

Почему значение 124?

a неинициализирован, поэтому его чтение даст вам непредсказуемое значение. Чтение неинициализированной нестатической локальной переменной - UB. Но неинициализированные глобальные и статические переменные инициализируются с 0 во время компиляции, и чтение их в порядке.

Почему значение c равно 0, а не указатель, такой как c2, который имеет одинаковый синтаксис?

c также неинициализирован, поэтому то, на что он указывает, также не определено, как указано выше. Это указатель вроде c2, но он указывает на NULL (что равно 0).

Почему c размер всего 2 байта, а не 4?

c Размер указателя зависит от архитектуры и/или компилятора. В этом случае c занял 8 байтов. вычесть адрес c с адреса c2.

0x7ffefad88d10 - 0x7ffefad88d08 = 0x000000000008 Это шестнадцатеричные значения, а не десятичные.

Таким образом, c на самом деле является указателем, таким как c2 и занимает то же место в памяти.

Смежные вопросы