C 有没有可能找到变量名和指针?

C 有没有可能找到变量名和指针?,c,C,可能重复: 是否可以获取指针指向的数组的名称 例如: char name[20]; char *p=name int door_no; int *q= & door_no 在上面的例子中,我们给出了数组的基址,数组名和指针q指向door_no,但是如果我必须知道数组指向的变量的名称,会怎么样?指针q也指向的变量名是什么?有可能吗?我试过了,我得出了一个结论不,这是不可能的,但我仍在努力找到解决办法。你们觉得呢,伙计们?有什么办法使之成为可能吗?不,不可能。指针包含指向内存中某

可能重复:

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

例如:

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

在上面的例子中,我们给出了数组的基址,数组名和指针q指向door_no,但是如果我必须知道数组指向的变量的名称,会怎么样?指针q也指向的变量名是什么?有可能吗?我试过了,我得出了一个结论不,这是不可能的,但我仍在努力找到解决办法。你们觉得呢,伙计们?有什么办法使之成为可能吗?

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

name -> mem space
q ------^
q和name之间没有任何联系,它们也不会倒退。这两种方法都可以让您访问内存空间,但您无法映射回它们。而且,程序不知道这些恰好映射到同一个东西!你知道的唯一原因是你设置了它

简短回答:不

长答覆:

在C语言中,编译后变量名不存在,所有内容都转换为内存位置或寄存器位置


如果两个对象的寿命不重叠,编译器可能会将多个变量分配到同一内存/寄存器位置。因此,在运行时变量名的概念在C的上下文中没有任何意义。这一开始只是一个注释,但后来我意识到,作为一个实际的答案,它可能工作得更好

如前所述,这个问题的简短答案是,正如其他人已经指出的,不,您不能从内存位置映射到对应于该位置的变量名

想想如果真的有可能做你想做的事情会发生什么。这是给你的一个思想实验。我假设是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[]无限扩展,甚至暂时忽略内存保护,因此任何内容都将映射到videomemory[]占用的内存中,只要给定足够大的数组索引。

这是可能的,但只能在原始对象的范围内

您给出了这些示例,我稍微修改了格式:

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");

如果传统上编译和执行程序,就不可能得到变量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; }
可能的取决于编译器/RTE。但我猜在C中你的机会是有限的。可能不会。这是一个问题,我一直在尝试。我甚至认为这是不可能的,但仍然让我知道背后的任何原因。使代码不可能的是在运行时缺少关于符号的信息。如果符号以某种方式是二进制的,您可能能够提取它们并将它们与内存地址关联。但是,我不认为是这样。这属于这样,因为它在当前形式下纯粹是客观的。好的,在编译之后,变量也应该被编译,它是编译器如何管理它的?为上一段给出一个例子,假设两个函数,A和B,将指向局部变量的指针传递给函数D。如果按顺序调用A和B,则局部变量可能位于内存中完全相同的位置,但名称甚至类型可能不同。