我正在写一个演示程序来打印变量的地址。为了使代码看起来更清晰,我创建了一个声明函数的头文件(ex.pointer.h)和一个用于调用该函数的C文件(ex.我想打印在main. c中调用的变量名的变量的地址
main.c:
#include "pointer.h"
int main(int argc, char *argv[]){
int var=40;
printAddress(var);
}
pointer.h
#include<stdio.h>
int *p;
#define getName(var) #var
void printAddress(int a){
p=&a;
printf("Address of variable %s is %p\n",getName(a),p);
}
我尝试使用宏,但它打印Address of variable a is 0x7fff2424407c
,这不是预期的输出Address of variable var is 0x7fff2424407c
。有没有人能告诉我应该做什么改变,请解释一下。
4条答案
按热度按时间oxosxuxt1#
你不能像你展示的那样使用函数打印变量的地址。原因是
a
是局部变量,它的标识与传递给printAddress
的变量的标识不同。您也无法获取名称,因为该名称在该上下文中不存在。
但是,您可以使用宏:
注意这里的
#
是预处理器的字符串化操作符;它将一个token转换为一个C字符串文字(实际上只是在token周围添加引号)。完整示例:
huwehgph2#
宏可以在将变量传递给实际函数之前准备变量的名称和地址。不要在生产代码中这样做:
lrl1mhuk3#
我尝试使用宏,但它打印变量a的地址是0x 7 fff 2424407 c,这不是变量var的预期outputAddress是0x 7 fff 2424407 c。
在调用
getName
的地方,变量名是a。没有办法追溯到你传递了一个之前被变量var
引用过的值。这是因为,就编译器而言,您没有传递变量的“名称”,而是传递了它的值-在本例中是一个整数-为了使代码可读,它是printAddress
函数体中的名称a。现在,实现你想要的唯一方法是摆脱函数,并将整个事情实现为宏。
或者,您可以创建一个模板类,将变量的值和名称保留为成员变量,但这将是一个矫枉过正。如果你需要这个来进行调试,那么请考虑使用调试器,比如gdb(或者更好的cgdb)--这将是一个更好的选择。
qij5mzcb4#
在调用getName的地方,变量名是。没有办法追溯到你传递了一个变量var之前引用过的值。这是因为,就编译器而言,你没有传递一个变量的“名称”,但它的值-在这种情况下是一个整数-为了使代码可读,它是printAddress函数体中的名称。
现在,实现你想要的唯一方法是摆脱函数,并将整个事情实现为宏。
或者,您可以创建一个模板类,将变量的值和名称保留为成员变量,但这将是一个矫枉过正。如果你需要这个来进行调试,那么请考虑使用调试器,比如gdb(或者更好的cgdb)--这将是一个更好的选择。