打印C程序中的当前地址

11 c memory

想象一下,我有以下简单的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++中没有一对一的地址到行映射,但你仍然可以说"给我一个指向这段代码的指针".

  • 问题本身有各种非标准方面.提供非标准扩展的答案是公平的. (5认同)
  • 这似乎是一个非标准的扩展 (4认同)
  • 请注意,这可能与您想象的不符 - 例如,gcc 可以确定 a、b 和 c 是有效的常量,删除所有它们,然后 sum 有效地指向 printf 语句。 (2认同)

Mic*_*ael 6

Visual C++具有_ReturnAddress内在函数,可用于获取一些信息.

例如:

__declspec(noinline) void PrintCurrentAddress()
{
    printf("%p", __ReturnAddress);
}
Run Code Online (Sandbox Code Playgroud)

这会给你一个接近你正在看的表达式的地址.如果进行一些优化,例如尾部折叠,这将是不可靠的.