Как напечатать адрес памяти определенной константы в переполнении стека

Код:

#include <cstdlib>
#include <iostream>
#define PI 3.14159

using namespace std;

int main(int argc, char** argv) {
cout<<"Address of PI:"<<&PI<<endl;
return 0;
}

Вот вывод:

main.cpp: в функции int main(int, char**)':
main.cpp:20: error: non-lvalue in unary
&’
сделать [2]: * [build / Debug / Cygwin-Windows / main.o] Ошибка 1
сделать [1]:
[.build-conf] Ошибка 2
делать: *
* [.build-impl] Ошибка 2

Так почему я не вижу здесь адрес памяти PI?

Спасибо.

0

Решение

Макросам никогда не выделяется память. Перед компиляцией кода компилятор выполняет текстовый поиск в файле и заменяет все макросы их значениями. Также это текстовый поиск, поэтому текст заменяется. Таким образом, PI заменяется на 3.14 в вашем коде перед его компиляцией. В результате оператор памяти выдает ошибку, поскольку он не может получить значение 3,14, поскольку он не является переменной. Надеюсь, поможет 🙂

4

Другие решения

В вашем коде PI не имеет адреса памяти. Поскольку это макрос препроцессора, его значение подставляется везде PI появляется в вашей программе.

Если вы превратили его в переменную, вы сможете взять его адрес:

const double PI = 3.1415926;
3

Вы не можете взять адрес числового литерала. Вы могли бы для переменной, хотя:

// #define PI 3.14159
static const double PI = 3.14159;
3

Препроцессор заменит PI от 3.14159 везде в вашем коде. Следовательно, номер не находится в памяти.

1
По вопросам рекламы [email protected]