2013-11-30 1 views
-1

У меня есть этот код:Значение unintialized автоматических переменных

int a,b; 

int* aPtr = &a; 

int* bPtr = &b; 

std::cout << "a: " << *aPtr << std::endl; 
std::cout << "b: " << *bPtr << std::endl; 

Когда я не присвоить значение а/б:

значение * aPtr является 1984125892 & значение * bPtr 4285552.

Почему это?

+3

Потому что '' и 'b' неинициализированы. У вас неопределенное поведение. – juanchopanza

ответ

2

Если вы не присваиваете значение переменной a and b, то это неопределенное поведение. И вы можете ожидать любое количество мусора в результате. Указатель показывает адрес переменной, и когда вы говорите, что int a, то это означает, что вы назначаете некоторую память переменной a. Поэтому вам нужно инициализировать переменную a иначе это приведет к неопределенным поведением. И когда вы напечатаете результат, он будет показывать любое количество мусора.

+0

Формально вы ничего не можете ожидать. На практике вы получаете стоимость мусора. –

-1

a и b содержатся в стеке. Если вы не присвоите им какое-либо значение, они будут иметь только значения, которые были в стеке, поскольку пространство для них было выделено/зарезервировано. Это связано с указателями.

+0

Почему downvote? – Paranaix

0

Указатель - это инструмент, который показывает адрес переменной в памяти, а не сама переменная. int a означает, что вы сохраняете некоторую память (которая может быть заполнена другими вещами из предыдущих программ). Таким образом, вы должны предварительно инициализировать (дать начальное значение) до a.

0

Нет значения инициализации по умолчанию для целых чисел в C++, в отличие от других языков, которые инициализируются с помощью 0. Указатели в вашем случае указывают только на некоторую ячейку памяти, а значения отражают все, что находится в этом месте, что может изменяться в зависимости от множество факторов.

+0

Java, например, не имеет инициализации по умолчанию для локальных переменных. Это, вероятно, одно и то же для многих языков. – keyser

+0

@ ᴋᴇʏsᴇʀ Java - это совсем другая история. В Java все переменные являются ссылками, это не так в C++. То, что нужно инициализировать переменные, применимо только к (целым?) Типам в C++. Создаются нормальные объекты (по умолчанию). – Paranaix