是否有可能获得数组指针指向的名称?是否可以找出变量名称,指向的指针?
例如:
char name[20];
char *p = name
int door_no;
int *q = &door_no
在上面的例子中,我们与阵列name
和指针q
指向door_no
但什么给数组的基本地址,如果,我必须知道变量名数组是指向?什么是变量名称指针q
指向?可能吗?我试着得出结论,这是不可能的,但我仍然试图得到解决方案。你认为什么人?有什么办法可以做到吗?
是否有可能获得数组指针指向的名称?是否可以找出变量名称,指向的指针?
例如:
char name[20];
char *p = name
int door_no;
int *q = &door_no
在上面的例子中,我们与阵列name
和指针q
指向door_no
但什么给数组的基本地址,如果,我必须知道变量名数组是指向?什么是变量名称指针q
指向?可能吗?我试着得出结论,这是不可能的,但我仍然试图得到解决方案。你认为什么人?有什么办法可以做到吗?
不,你不能那样做。在你的代码被编译和链接后(除非你保留调试信息),变量名甚至不存在,所以你不能在运行时得到它。
在C中(与JavaScript或古典Lisp等非常动态的语言相比),变量名称的作用仅仅是告诉编译器/链接器当您提到变量时,您指向哪个声明源代码。一旦这些连接已经在编译器的内部数据结构中进行并表示出来,那么名称就不再使用(除了调试和/或漂亮地打印来自编译器的错误消息外)。
酷它给了我一些明智的理由谢谢! – niko
+1打我。 :-) –
Henning在我之前说过的一切都是正确的。另外,指针的目标可能是甚至没有变量名称。例如,考虑:
char a;
char *ptr = &a + 5;
现在PTR是指向不具有任何与一个(事实上可能会指向分配给你的程序内存之外,并与指针做任何可能导致地方分段故障)。
如果您传统编译和执行程序,则无法获取变量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; }
你为什么要这么做? –