是否有可能找到变量名,指针指向?

时间:2011-08-26 13:31:35

标签: c

  

可能重复:
  Is it possible to find out the variable name, the pointer pointing to?

是否可以获得指针指向的数组名称?

示例:

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

在上面的例子中,我们给出了数组的基地址,数组名称和指针q指向door_no但是如果,我必须知道数组指向的变量的名称呢?什么是变量名称指针q也指向?是否有可能我做了尝试,我得出结论不是不可能,但我仍然试图得到解决方案。你觉得怎么样?有没有办法让它成为可能?

5 个答案:

答案 0 :(得分:8)

简短回答:不。

长答案:

在C变量名称编译后不存在(所有内容都转换为内存位置或寄存器位置)。

如果两个对象的生命周期不重叠,编译器可能会将多个变量分配到同一个内存/寄存器位置。因此,运行时变量名的概念没有意义(在C的上下文中)

答案 1 :(得分:1)

不,这是不可能的。您的指针将地址保存到内存中的空间。变量名是您定义的名称,表示内存中的空间。所以,你有这样的事情:

name -> mem space
q ------^

没有任何内容可以将q与名称联系起来,而且它们不会倒退。它们都会让你进入内存空间,但你无法映射回它们。此外,该程序不知道这些碰巧映射到同一件事!您知道的唯一原因是因为您将其设置为这样做。

答案 2 :(得分:1)

这是可能的,但仅限于原始对象的范围内。

你给出了这些例子(我稍微修改了格式):

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

您可以进行与您的作业相当的比较,因此:

if (p == name)
    printf("p == name\n");
if (q == &door_no)
    printf("q == &door_no\n");

答案 3 :(得分:0)

这开始是一个评论,但后来我意识到它可能作为一个真正的答案更好。

正如其他人已经指出的那样,对所述问题的简短回答是 no ,您无法从内存位置映射到与该位置对应的变量名称。

想想如果实际上有可能做出你想要的事情会发生什么。这是一个思想实验。我假设是C,但它应该同样适用于任何支持任意内存位置指针的语言(包括其他变量占用的内存位置)。

假设您从两个指向相同内存位置的指针开始:

char p[] = DUMMY;
char *q = &p;

现在,如果你以某种方式取消引用&q,你就会获得p。好的,从理论意义上说,那种有点有用。现在,添加:

char *r = &q;

现在,你有双重间接。如果您试图找出哪些名称指向与名称p相同的内存位置,结果是什么?如果我记得指针语法正确,则会得到*q*(*r)。编译器如何告诉您,特别是在运行时?

假设p[]足够大。对于任意数字n,请将*q作业替换为:

char *q = &p + n;

现在,同样取消引用q的结果是什么?如果q现在超出p[]的范围,结果会是什么? (好吧,后者可能只是q,但那么重点是什么?)

或者,这种做法在GUI广泛出现之前很常见。试试这个(不要介意实际的地址)。

short *videomemory = 0xB8000;
/* and then, at some later point... */
videomemory += 4;

然后,尝试找到与videomemory的值相对应的地址(0xB8004,如上所述)。结果是什么?原则上,“数组”videomemory[]无限延伸,甚至包裹(暂时忽略内存保护),因此任何将映射到{{1}占用的内存中只给出足够大的数组索引。

答案 4 :(得分:0)

如果你传统上编译和执行程序,就不可能得到变量pq的名称,因为编译器所做的一件事就是忘记了变量,只保留地址。

根据您要执行的操作,您可以在保留名称的非传统执行环境中执行该程序。例如,

~ $ 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; }