Как имя переменной хранится в C?

Я хочу спросить, как C хранятся в C?

Чтобы более четко рассмотреть следующий код:

int main() {
    int a = 1, b;
    b = a + 2;
    return 0;
}

Например, здесь, в какой памяти C хранятся имена переменных мест.

Например, если &a=0x12A7 (предположим) &b=0x123B1, то как и где c хранит имена переменных, например, в которых хранится имя памяти a?

Ответ 1

C не сохраняет имя переменных. Его компилятор, который хранит имена переменных в таблице символов компилятора.
Эта структура данных создается и поддерживается компилятором.
example таблицы символов для фрагмента

// Declare an external function
extern double bar(double x);

// Define a public function
double foo(int count)
{
    double  sum = 0.0;

    // Sum all the values bar(1) to bar(count)
    for (int i = 1;  i <= count;  i++)
        sum += bar((double) i);
    return sum;
}  

может содержать по крайней мере следующий символ:

введите описание изображения здесь

Ответ 2

Переменные имена не обязательно должны быть сохранены! Компилятор может полностью избавиться от них. Представьте себе, если компилятор достаточно умный, он может сократить вашу всю программу до этого:

int main(){
  return 0;
}

Обратите внимание, что эффект этой программы в точности совпадает с вашим оригиналом, и теперь нет никаких переменных! Не нужно называть их сейчас, есть ли?

Даже если переменные в вашем коде были фактически использованы, их имена являются просто удобной записью, когда вы пишете программу, но не нужны процессору, когда он выполняет ваш код. Что касается микропроцессора, то такая функция:

int foo(int x, int y) {
  int z = x + y;
  return z * 2;
}

Может получиться скомпилированный код, который делает это, в некоторой гипотетической простой архитектуре набора инструкций (ISA):

ADD # consumes top two values on stack (x and y), pushes result (z)
PUSH 2 # pushes 2 on stack
MULT # consumes top two values on stack (z and 2), pushes result
RET

Более длинная история заключается в том, что имена переменных иногда хранятся для целей отладки. Например, если вы используете GCC, вы можете передать параметр -g, чтобы испустить "таблицу символов", которая содержит такие вещи, как имена переменных для отладки. Но просто не нужно запускать программу, и она не покрывается стандартом языка - это функция реализации, которая отличается платформой.

Ответ 3

Хорошо сначала, если вы просто получаете свою голову на пролив с помощью C, с чего начать: http://condor.cc.ku.edu/~grobe/intro-to-C.shtml

Но это более практично, чем ваш вопрос. Чтобы ответить на это, мы сначала спросим, ​​почему переменные имеют адреса. Почему здесь находится стек. Для работы программы обратные вызовы должны быть направлены в соответствующий буфер, чтобы все части соответствовали друг другу, как было разработано. Теперь, к чему я верю, был исходный вопрос, именно так решается фактический адрес, для ответа на это вам нужно будет понять, как процессор реализует кучу.

https://en.wikipedia.org/wiki/Memory_management

"Поскольку точное местоположение распределения неизвестно заранее, к нему обращаются косвенно, обычно с помощью ссылки на указатель. Конкретный алгоритм, используемый для организации области памяти, выделения и освобождения фрагментов, связан с ядром.."

Это возвращает нас к практической стороне вещей с абстракцией указателям:

https://en.wikipedia.org/wiki/C_dynamic_memory_allocation

Надеюсь, вам дается более четкое представление о том, что под капотом:)

Счастливая игра.