将地址写入指针
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
。此类型始终定义为大到足以在您的平台上包含指针的类型。
我有一个指针 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
。此类型始终定义为大到足以在您的平台上包含指针的类型。