如何使用 printf() 以十六进制一一读取内存字节(因此没有任何格式)

Mic*_*lle -1 c hex

我有兴趣在 ubuntu 上使用 netbeans 在 C.Im 中读取一个字节的内存,下面是我只读取一个字节的代码(不是 a 的全部值)。但屏幕上什么也没有打印出来。

main()
{
int a[1]={3};
//printf(%d",a[0]); //line 2
printf("\x07",a[0]); //line 3
}
Run Code Online (Sandbox Code Playgroud)

在我的想法中,带有标签 a 的地址中的内存由以下部分组成:

  • 0x0004 03
  • 0x0008 00
  • 0x000c 00
  • 0x000f 00

第 2 行中的 printf() 语句表示转到地址 0x???4 和:

  1. 读取 4 个字节(因为 d 字符)
  2. 将这 4 个字节表示为一个数字,这意味着将它们乘以 2 的幂(因为 d 字符)

第 3 行中的 printf() 语句使用\ (而不是 %)和从 0 到 7(1 个字节)的位。所以它表明,去地址 0x0004 和:

  1. 项目清单
  2. 读取 1 个字节(因为 07 个字符)2-除了将每个 4 位显示为十六进制值之外什么都不做

所以代码应该打印出 0x0004 中的第一个字节是 03。但它没有。任何线索?

提前致谢

请不要只是更正我的语法。您认为我关于 printf 中的格式化程序的假设是否正确?

Pau*_*l R 6

使用指针来寻址各个字节a并更改printf以使用%x格式说明符,例如:

int main(void)
{
    int a = 3;
    unsigned char *p = (unsigned char *)&a;
    int i;

    printf("a =");
    for (i = 0; i < sizeof(a); ++i)
    {
        printf(" %02x", p[i]);
    }
    printf("\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在具有 32 位整数的小端机器上,这应该产生以下输出:

a = 03 00 00 00
Run Code Online (Sandbox Code Playgroud)