c - Char 数组,字符串表示一个内存地址,我如何向该地址添加值?
问题描述
我有一个 char 数组,其中包含一个内存地址,例如 char add[8]="000AAC88"; 我想将一个字符放入 add 数组指定的内存地址中,换句话说,我想在 000AAC88 的内存地址中有一个字符,例如 'a' 这将在 C 中完成
解决方案
您可以使用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;
}
转换为 achar*
后,您可以对其进行指针运算。
您假设 8 个十六进制数字足以容纳一个指针将中断 64 位代码。在此示例中,为简洁起见,我假设 anunsigned long long int
足够宽以存储任何指针。但是,如果您想尽可能地便携和面向未来,您可以使用<inttypes.h>
with中的常量sscanf()
。或者,POSIX(和 Linux)也提供了宽度受限的环境,以保证 anunsigned long
的宽度足以容纳一个指针。
推荐阅读
- mdriven - 覆盖时 GetVMImageUrl 不起作用
- r - 如何在不同 data.frames 中的多个列上应用 na.locf,所有列都以“价格”结尾
- python - python中逐行逐列的多个矩阵
- react-native - 如何在不影响内部视图元素的情况下应用阴影来反应原生视图?
- azure - 如何使用特定于 Azure VPN 要求的 MakeCert 命令为 Azure VPN 创建根证书
- wordpress - 新参数 FB 添加到外部链接 (fbclid)
- android - Zebra TC25 - 如何在后台继续接收广播意图
- android - 连接后不久发出的 Socket.IO 消息通常不会被 Android 客户端接收
- api - 了解 Vulkan 中的标志
- ruby-on-rails - 推送到 Gitlab 创建的存储库失败并出现错误