То, что вы получаете за a.i
, не определено, вы должны ожидать получить любое значение.
Зависит от системы, используемой библиотеки std, компилятора, флагов компилятора, ... некоторые части памяти (например, стек) могут быть инициализированы с 0
, но это не гарантируется.
Это также верно для gcc
, в вашем простом примере вы всегда можете получить 0
, но если вы отключите оптимизацию -O0
и скомпилируете следующий код:
#include <iostream>
struct A
{
int i;
int j;
};
int foo() {
A a;
const int b = a.i;
a.i = 123;
return b;
}
int main() {
const int n1 = foo();
const int n2 = foo();
std::cout << n1 << " " << n2 << std::endl;
return 0;
}
Тогда (в зависимости от библиотеки os, std, cpu ...) вы получите следующий вывод:
0 123
В обоих случаях a.i
неинициализирован, для первого вызова a.i
содержит некоторое «случайное» число, для второго вызова a
может быть создано в том же месте, и на данный момент эта часть памяти может все еще содержать 123
. Причина этого заключается в том, что A
создается в стеке, и последующие вызовы off foo
, скорее всего, приведут к тому, что a
будет находиться по тому же адресу памяти в стеке.