可能重复:
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也指向?是否有可能我做了尝试,我得出结论不是不可能,但我仍然试图得到解决方案。你觉得怎么样?有没有办法让它成为可能?
答案 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)
如果你传统上编译和执行程序,就不可能得到变量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; }