我想知道我们是否可以仅使用 C 语言中特定位置的裸地址来打印该位置的数据。
例如,这是我使用的代码:
#include<stdio.h>
int main(int argc, char** argv) {
int num = 10;
int *ptr;
ptr = #
//To output the address of the "num" variable
printf("Address: %p\n", ptr);
//Address is 0x7fff47808f50...
//Using that address to print the data at variable "num"
printf("Data: %d\n", *(0x7fff47808f50));
return 0;
}
但是显示错误。也许我使用了错误的语法,或者这不是正确的方法。无论如何,请告诉我正确的方法。
最佳答案
您可以(认为不应该)将整数转换为指针,如下所示:(void *) 0x7fff47808f50
。
但是,转换具有实现定义和未定义的方面,这意味着您的里程会有所不同。该值显然会随着编译器的不同而发生变化,甚至对于不同的编译来说也是如此,并且字节顺序可能与我们通常编写数字的方式不同,这意味着您可能需要进行大量修改才能使其正常工作。
这在实践中仍然是可以证明的,当实现定义的行为允许我们重现该行为时,以下内容将是合规的:
unsigned long long ptr_as_integer = (unsigned long long) "hello world";
printf("%s", (void *) ptr_as_integer);
int value = 42;
unsigned long long value_ptr_as_integer = (unsigned long long) &value;
printf("%d", * (int *) value_ptr_as_integer);
还有专门为此设计的 uintptr_t
类型,但这是可选,因此不能保证存在...
保持好奇心很好;这就是我们最好的学习方式...但请不要在实践中使用它!您多久被教导不要使用魔数(Magic Number)?
关于我们可以在C中只使用裸地址打印数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45696322/