Можно ли узнать имя переменной, на которую указывает указатель? - PullRequest
2 голосов
/ 26 августа 2011

Возможно ли получить имя массива, на который указывает указатель?

пример:

 char name[20];
 char *p = name
 int door_no;
 int *q = &door_no

В приведенном выше примере мы даем базовый адрес массива с массивомname и указатель q, указывающий на door_no, но что, если я должен знать имя переменной, на которую указывает массив?На что указывает указатель имени переменной q?Является ли это возможным?Я попытался и пришел к выводу, что это невозможно, но все же я пытаюсь найти решение.Как вы думаете, ребята?Есть ли способ сделать это возможным?

Ответы [ 3 ]

18 голосов
/ 26 августа 2011

Нет, вы не можете этого сделать. Имена переменных даже не существуют после того, как ваш код скомпилирован и скомпонован (если вы не храните отладочную информацию), поэтому вы не можете получить его во время выполнения.

В C (в отличие от очень динамичных языков, таких как JavaScript или классический Lisp), роль имен переменных only состоит в том, чтобы сообщать компилятору / компоновщику, на какое объявление вы указываете, когда упоминаете переменная в исходном коде. После того, как эти соединения установлены и представлены во внутренних структурах данных компилятора, имена перестают использоваться (опять же, за исключением отладки и / или приятной печати сообщений об ошибках от компилятора).

1 голос
/ 26 августа 2011

Все, что Хеннинг сказал передо мной, правильно. Кроме того, цель указателя может даже не иметь имени переменной. Например, рассмотрим:

char a;
char *ptr = &a + 5;

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

0 голосов
/ 27 августа 2011

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

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

~ $ cat t.c
main(){
 char name[20];
 char *p=name;
 int door_no;
 int *q= & door_no;
}
~ $ frama-c -val t.c
[kernel] preprocessing with "gcc -C -E -I.  t.c"
...
[value] ====== VALUES COMPUTED ======
[value] Values for function main:
          p ∈ {{ &name ;}}
          q ∈ {{ &door_no ;}}
          __retres ∈ {0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...