问题描述
我正在编写一个演示程序来打印变量的地址。为了使代码看起来更简洁,我创建了一个头文件,其中声明了该函数(例如:pointer.h)和一个用于调用该函数的C文件(例如,main.c)。我想用在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
。谁能告诉我我应该做些什么改变,请解释一下。
解决方法
您不能使用显示的函数来打印变量的地址。原因是a
是局部变量,与您传递给printAddress
的 value 的变量具有不同的标识。
您也无法获得名称,因为该名称在该上下文中不存在。
但是,您可以使用宏:
#define printAddress(x) printf("Address of variable %s is %p\n",#x,&x)
请注意,#
是预处理器的字符串化运算符;它将令牌转换为C字符串文字(实际上只是在令牌周围添加引号)。
完整示例:
#include <stdio.h>
#define printAddress(x) printf("Address of variable %s is %p\n",&x)
int main(void)
{
int foo;
printAddress(foo);
return 0;
}
,
宏可以在将变量传递给实际函数之前准备变量的名称和地址。不要在生产代码中执行此操作:
#include <stdio.h>
void printAddress(char *name,void *address)
{
printf("The address of %s is %p.\n",name,address);
}
#define printAddress(x) printAddress(#x,&(x))
int main(void)
{
int var = 40;
printAddress(var);
}
,
我尝试使用宏,但是它的变量a的printsAddress为0x7fff2424407c,而不是变量var的预期输出地址为0x7fff2424407c。
在调用getName
的位置,变量名称为 a 。无法追溯您之前已传递了变量var
所引用的值。这是因为,就编译器而言,您没有传递变量的“名称”,而是它的值(在这种情况下为整数),为了产生易于理解的代码,其名称为 a 在printAddress
函数主体中。
现在,实现所需目标的唯一方法是摆脱功能并将整个对象实现为宏。
或者,您可以创建一个模板类,该模板类将变量的值和名称保留为成员变量,但这可能会过大。如果出于调试目的需要此功能,请考虑使用gdb(或更好的cgdb)之类的调试器-这将是更好的选择。