2011-08-26 88 views
0

可能重复:
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也指向?有没有可能我做了尝试,我得出了一个结论:不可能,但Iam试图找到解决方案。你认为什么人?有什么办法可以做到吗?

+0

可能吗?取决于编译器/ RTE。但我想在C中你的机会是有限的。可能不会。这是一个stackoverflow问题。 – Falcon

+0

以及我一直在尝试它。我甚至认为它不可能,但仍然让我知道背后的任何原因。是什么让它不可能 – niko

+0

代码在运行时缺少关于符号的信息。如果符号以某种方式在二进制文件中,您可能能够提取它们并将它们与内存地址相关联。但是,我不认为是这样。 – Falcon

回答

8

简短的回答:第

龙答:

在C不编译后存在的变量名(一切都被转换成任何存储位置或寄存器位置)。

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

+1

为了给出最后一段的一个例子,假设两个函数A和B将局部变量的指针传递给函数D.如果顺序地调用A和B,局部变量可能在内存中完全相同的点上,但是名称和类型可能不同。 –

1

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

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

没有什么连接q到名称,他们不会倒退。他们两人都会让你进入记忆空间,但你不能映射回他们。此外,该程序不知道这些碰巧映射到相同的东西!你知道的唯一原因是因为你设置了它。

0

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

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

想想看会发生什么,如果它真的有可能做你想要的东西。这是你的一个想法实验。我假设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,但那有什么意义呢?)

或者,在图形用户界面广泛出现之前,这种做法相当普遍。试试这个(不要介意实际的地址)。

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

然后,尝试寻找对应于videomemory的值的地址(0xB8004,在上述的)。结果是什么?原则上,“阵列”videomemory[]无限延伸,甚至环绕(让我们暂时忽略内存保护),因此任何东西将映射到内存“占用”videomemory[],只有足够大的数组索引。

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"); 
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; } 
相关问题