想象一下,我有以下简单的C程序:
int main() {
int a=5, b= 6, c;
c = a +b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想知道表达式c = a + b的地址,即执行此添加的程序地址.我有可能使用printf吗?沿线的东西:
int main() {
int a=5, b= 6, c;
printf("Address of printf instruction in memory: %x", current_address_pointer_or_something)
c = a +b;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道如何通过使用gdb然后使用info line file.c:line找到地址.但是,我应该知道我是否也可以直接使用printf.
Cha*_*lie 23
在gcc中,您可以使用&&运算符获取标签的地址.所以你可以这样做:
int main()
{
int a=5, b= 6, c;
sum:
c = a+b;
printf("Address of sum label in memory: %p", &&sum);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
&& sum的结果是跳过指令的目标,如果你这样做的话就会发出goto sum.因此,虽然在C/C++中没有一对一的地址到行映射,但你仍然可以说"给我一个指向这段代码的指针".
Visual C++具有_ReturnAddress内在函数,可用于获取一些信息.
例如:
__declspec(noinline) void PrintCurrentAddress()
{
printf("%p", __ReturnAddress);
}
Run Code Online (Sandbox Code Playgroud)
这会给你一个接近你正在看的表达式的地址.如果进行一些优化,例如尾部折叠,这将是不可靠的.
| 归档时间: |
|
| 查看次数: |
35585 次 |
| 最近记录: |