首页 > 解决方案 > Char 数组,字符串表示一个内存地址,我如何向该地址添加值?

问题描述

我有一个 char 数组,其中包含一个内存地址,例如 char add[8]="000AAC88"; 我想将一个字符放入 add 数组指定的内存地址中,换句话说,我想在 000AAC88 的内存地址中有一个字符,例如 'a' 这将在 C 中完成

标签: 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的宽度足以容纳一个指针。


推荐阅读