Исправление:
Я перепутал концепцию адреса указателя и адреса, на который указывает указатель, поэтому следующий код был изменен. И теперь он печатает, что я хочу, переменные a, c, i, j, k, p находятся в стеке, а переменные b, d находятся в куче. Статические и глобальные переменные находятся в другом сегменте. Большое спасибо всем вам!
Хорошо, я знаю, что эти две концепции глубоко обсуждены ... но у меня все еще есть вопросы для следующего кода:
#include <iostream>
using namespace std;
class A {
};
int N = 10;
void f(int p) {
int j = 1;
float k = 2.0;
A c;
A* d = new A();
static int l = 23;
static int m = 24;
cout << "&c: " << &c << endl;
cout << "&d: " << d << endl;
cout << "&j: " << &j << endl;
cout << "&k: " << &k << endl;
cout << "&l: " << &l << endl;
cout << "&m: " << &m << endl;
cout << "&p: " << &p << endl;
}
int main() {
int i = 0;
A* a;
A* b = new A();
cout << "&a: " << &a << endl;
cout << "&b: " << b << endl;
cout << "&i: " << &i << endl;
cout << "&N: " << &N << endl;
f(10);
return 0;
}
Мой результат:
&a: 0x28ff20
&b: 0x7c2990
&i: 0x28ff1c
&N: 0x443000
&c: 0x28fef3
&d: 0x7c0f00
&j: 0x28feec
&k: 0x28fee8
&l: 0x443004
&m: 0x443008
&p: 0x28ff00
Это довольно интересно, потому что кроме глобальной переменной N и двух статических переменных в функции f, которые представляют собой l и m, адреса всех остальных переменных кажутся вместе. (Примечание: код и результаты были изменены и не соответствуют тому, что здесь сказано.)
Я много искал о стеке и куче. Здравый смысл заключается в том, что, если объект создается «новым», он находится в куче. А локальные переменные (такие как j и k в приведенном выше примере) находятся в стеке. Но, похоже, это не так в моем примере. Это зависит от разных компиляторов, или я не так понимаю?
Большое спасибо всем вам.