从其地址获取变量的名称?

时间:2018-01-11 10:24:57

标签: c memory-management

我想知道是否可以通过C中的内存地址访问变量。 例如,我创建一个变量" aa"然后我通过printf和& aa打印其内存地址...假设它的地址是12345。 有没有办法通过仅使用12345而非指针获取变量,如下所示:

printf("%d", 12345);

通过这种方式,我希望指令打印" aa"。

对不起,如果不清楚,我会告诉你代码:

int main()
{
    int aa=1; //assume its adress is 12345
    printf("%d", 12345); // I want to use 12345 as parameter to print the variable
}

非常感谢。

3 个答案:

答案 0 :(得分:1)

假设您的变量的地址绝对是12345

printf("Value at the address %d:%d", 12345, *(int*)12345);

以更一般的方式:

int aa = 10; // Your variable 'aa'
int* aa_ptr = &aa; // 'aa_ptr' contains the address of the variable aa.

printf("The variable 'aa' is at the address %p and contains the value: %d", aa_ptr, *aa_ptr); // '*aa_ptr' would show the value of the variable 'aa'

内存的地址在C 中称为“指针”。有关更多解释,请查看C 中指针的概念:first tutorial in google

注意:对于您的信息变量通常至少8位对齐(更常见的是32位对齐) - 地址应为偶数。因此,您不太可能在123451234412346等奇数地址处看到变量地址更有可能是有效地址。访问不对齐的地址有时会导致程序崩溃。

答案 1 :(得分:1)

这就是指针:

int aa = 12      ;   // defines an integer variable

int *pt = &aa;       // declare a pointer to the above variable

printf("Variable aa is at address %p\n", pt);
printf("Its value is %d\n", *pt);

在实模式编程中,当硬件寄存器映射到众所周知的位置时,在指针中存储绝对地址甚至是合法的:

char * screenmem = 0xB800; // absolute address of the screen text buffer on a PC in REAL MODE
screenmem[0] = 'A';        // writes a A in upper left corner

但除了:

  • 获取现有对象的地址
  • 使用众所周知的地址

取消引用指向任意地址(int * pt = 12345; *pt = 12;)的指针会调用Undefined Behavior。

答案 2 :(得分:0)

嗯,为了理论,是的,你可以做到。您应该问自己的问题是为什么或何时需要它?

您期望的一种方式可以完成:

int var = 0;
int * pVar = NULL;

pVar  = &var;

printf ("The address is %p\n", (void *)&var);
printf ("The same address (via pointer variable) is %p\n", (void *)pVar );

printf ("The value at the address is %d\n", *(&var));
printf ("The value at the address (via pointer) is %d\n", *pVar );

Check at ideone