我们可以在C中只使用裸地址打印数据吗?

标签 c pointers

我想知道我们是否可以仅使用 C 语言中特定位置的裸地址来打印该位置的数据。

例如,这是我使用的代码:

#include<stdio.h>

int main(int argc, char** argv) {

    int num = 10;
    int *ptr;
    ptr = &num;

    //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/

相关文章:

c - 如何用手电筒添加图像 channel ?

c - C 中的按位操作

c - 在http请求中记录xml内容

c - *( (int *)ptr+1) 的含义

c++ - 指针寻址如何在 C++ 中工作

javascript - selenium 使用 javascript 定位没有 id 或 name 的元素

C - 检查一个变量是否*没有*许多选项的最简洁的方法?

C:字符串反转:res[​​i] = *p--;有效,但是 *res++ = *p--;才不是

objective-c - 如何在 Objective-C 中声明双指针属性?

c - 为什么我不能将数组名称放在等号的左侧