字符数组,字符串表示内存地址,我该如何向该地址添加值?

时间:2018-12-07 03:16:38

标签: c

我有一个char数组,例如保存一个内存地址     char add [8] =“ 000AAC88”; 我想将一个字符放入add数组指定的内存地址中,换句话说,我想在000AAC88的内存地址中使用一个字符,例如“ a” 这将在C

中完成

2 个答案:

答案 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)

您可以使用sscanf将地址加载到指针。

char *p;
sscanf(add, "%08X", &p);
*p = 'a';

Check the usage of sscanf here