你怎么知道变量的确切地址?

how*_*ram 5 c pointers memory-address

所以我正在查看我的C编程教科书,我看到了这段代码.

#include <stdio.h>

int j, k;
int *ptr;

int main(void)
{
    j = 1;
    k = 2;
    ptr = &k;
    printf("\n");
    printf("j has the value %d and is stored at %p\n", j, (void *)&j);
    printf("k has the value %d and is stored at %p\n", k, (void *)&k);
    printf("ptr has the value %p and is stored at %p\n", (void *)ptr, (void *)&ptr);
    printf("The value of the integer pointed to by ptr is %d\n", *ptr);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我跑了它,输出是:

j的值为1,存储在0x4030e0,

k的值为2,存储在0x403100

ptr的值为0x403100,存储在0x4030f0

ptr指向的整数值为2

我的问题是,如果我没有通过编译器运行它,你怎么知道这些变量的地址只是看看这个代码?我只是不确定如何获取变量的实际地址.谢谢!

Sam*_*Sam 5

以下是我对它的理解:

C中内存中的事物的绝对地址未指定.它没有标准化为语言.因此,通过查看代码,您无法知道内存中的内容位置.(但是,如果使用相同的编译器,代码,编译器选项,运行时和操作系统,则地址可能是一致的.)

在开发应用程序时,这不是您应该依赖的行为.但是,在某些情况下,您可能会依赖于两件事的位置之间的差异.例如,您可以确定指向两个数组元素的指针地址之间的差异,以确定它们之间的元素数量.

顺便说一句,如果您正在考虑使用变量的内存位置来解决特定问题,您可能会发现在不依赖此行为的情况下发布单独的问题有助于如何解决问题.

  • 地址**不是实现定义的**.他们只是**未指明**.不同之处在于第一个必须记录,第二个不需要. (3认同)

Jen*_*ens 5

除了用"%p"打印变量之外,没有其他方法可以"知道标准C中变量的确切地址".实际地址由许多不受程序员编写代码控制的因素决定.这是操作系统,链接器,编译器,使用的选项以及其他可能的问题.

也就是说,在嵌入式系统领域,有一些方法可以表达此变量必须驻留在此地址,例如,如果外部设备的寄存器映射到正在运行的程序的地址空间.这通常发生在所谓的链接器文件映射文件中,或者通过为指针指定一个整数值(使用强制转换).所有这些方法都是非标准的.

但是,对于日常的园艺项目而言,编写C程序的关键在于您需要而且不应该关心变量的存储位置.