将地址写入指针

Write address to a pointer

我有一个指针 char *a 指向一块内存。我有另一个指针 char *b 指向一个内存块。假设 b 指向地址 0x10001111。我想将这个地址写入到 a 指向的内存块的下一个 8 个字节。简而言之,当我引用 a 时,我应该得到接下来的 8 个字节的内存和 value = 0x10001111。我怎么做?这是一台 x86_64 机器。

我当前的代码:

static void write_add(void *a, char *b)
{                                                                                                                                                                                                                                      *(unsigned long *)a= (unsigned long)b;
 *(unsigned long *)a= (unsigned long)b; 
 return;
}

我在取消引用 a 时只看到 0x00001111。为什么我看不到完整地址?

为什么要涉及一个单独的、不相关的不确定大小类型?如果你想把指针值精确地存储在 8 个字节中(假设值 适合 在 8 个字节中),你可以这样拼写:

#include <stdint.h>
static void write_add(void *a, char *b) {
    *(uint64_t *) a = (uint64_t) b; 
}

您也可以使用 memcpy(),但这似乎有点笨拙。

但是请注意,C 不保证指针值表示的大小。尽管 64 位在您的系统上可能就足够了,但您不能安全地假设它在每个系统上都足够了。

unsigned long 在您的平台上不一定是 64 位。你不能仅仅因为你在 x86_64 平台上就做出这样的假设。我敢打赌它实际上是 32 位。

您应该按照 cad 的建议使用 uintptr_t。此类型始终定义为大到足以在您的平台上包含指针的类型。