c - 有什么方法可以在 C 中取消引用内存地址吗?

标签 c

我了解 C 中指针的工作原理。指针基本上存储内存的地址(例如 addr1),取消引用指针可以为我们提供存储在该内存地址的值地址1。有什么可能的方法可以让我们直接取消引用内存地址addr1来获取存储在该位置的值?

我知道如何使用指针。我只是想知道后面到底发生了什么。我尝试使用内存地址在下面的代码中创建指针如何工作的相同场景。尽管我陷入了从指针获取值的困境。通过这个例子,我想知道指针的取消引用是如何工作的。

例如:

#define LOCATION 0x68feac //Assuming that the memory location is available

int main()
{
    int a = 10;
    *(int *)LOCATION = (int)&a;
    printf("%x\n", (*(int*)(LOCATION)));    //It gives me the address of a
    printf("%x\n", *((*(int*)(LOCATION)))); /* I thought it would de-refer but
                                                it gives me compile time error 
                                                "invalid type argument of unary 
                                                '*'" */

}

我尝试使用

如何取消引用LOCATION以便我们可以获得值10?任何想法或建议都会有帮助。

最佳答案

您要求的是:

printf("%x\n", *((int *)(*(int*)(LOCATION))));

因为在取消引用之前,您需要将从 *(int*)(LOCATION) 检索到的 int 值转换为指针。

但你真的不这样做!这是一种丑陋的语法,而 C 编译器在优化无用变量方面非常出色。所以帮自己一个忙,命名中介指针:

#define LOCATION 0x68feac //Assuming that the memory location is available

int main()
{
    int a = 10;
    int **loc = (int **)LOCATION;  // BEWARE only make sense in very special use cases!
    *loc = &a;
    printf("%p\n", *loc);    //It gives me the address of a
    printf("%x\n", **loc);
    return 0;
}

无论如何,在 C 语言中很少使用任意内存位置,因为编译器(和链接器)将使用你很难猜到的地址。我知道的唯一用例是访问嵌入式系统或内核模块中众所周知的物理地址

关于c - 有什么方法可以在 C 中取消引用内存地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54457408/

相关文章:

c - OS X 的低级窗口 API

pthreads 程序的竞争条件会使操作系统或 X 完全崩溃吗?

c - 如何在c中表示大于long的数字

c - 从有符号整数升级到无符号整数期间二进制数字变化的描述/会发生什么?

c - 当不与核心 Hook 时,应用程序运行速度更快

c - 自修改代码,复制/跳入堆失败

c++ - 如何在U盘中制作安装程序?

c - 使用一个进程向多个其他进程发送信号 "simultaneously"

无法在头文件中分配结构变量

c - 无法通过函数向数组添加项目 (C)