我有一个char数组,例如保存一个内存地址 char add [8] =“ 000AAC88”; 我想将一个字符放入add数组指定的内存地址中,换句话说,我想在000AAC88的内存地址中使用一个字符,例如“ a” 这将在C
中完成答案 0 :(得分:1)
您可以使用strtoull()
(以16为底数或sscanf()
)将ASCII的十六进制数字转换为足够大的整数,然后将其转换为指针。在这里,为简单起见,我使用strtoull()
。
如果您的库以适合您的方式实现它,则还可以使用%p
格式说明符在指针及其字符串表示形式之间直接进行转换。
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#define HEX_DIGITS_IN_PTR (sizeof(unsigned long long int)*2U)
int main(void)
{
static const char msg[] = "hello, world!\n";
char hex_address[HEX_DIGITS_IN_PTR] = {'\0'};
snprintf( hex_address,
sizeof(hex_address),
"%llX",
(unsigned long long int)(uintptr_t)(void*)&msg );
const char* const converted_ptr =
(void*)(uintptr_t)strtoull( hex_address, NULL, 16 );
fputs( converted_ptr, stdout );
return EXIT_SUCCESS;
}
一旦转换为char*
,就可以对其进行指针运算。
您的假设8个十六进制数字足以容纳一个指针,这将破坏64位代码。在本示例中,为简便起见,我假设unsigned long long int
的宽度足以存储任何指针。但是,如果您想尽可能地具有可移植性和耐将来性,可以将<inttypes.h>
中的常量与sscanf()
一起使用。另外,POSIX(和Linux)还提供了宽度受限的环境,以保证unsigned long
的宽度足以容纳指针。
答案 1 :(得分:0)