【问题标题】:C %p printing 16 instead of 8 bytesC %p 打印 16 而不是 8 个字节
【发布时间】:2021-02-05 06:45:48
【问题描述】:

我需要打印一个指针的地址。 这是我的代码:

float arr[5] = {1.2 , 2.3 , 5 , 7.1 , 9.6};
float *ptrarr;
ptrarr = &arr[0];

printf("Address of ptrarr+2=%p,%p \n\n",ptrarr+2,&arr[2]);

我知道指针地址有 8 个字节,但我的输出总是 16 个字节。 这是输出

Address od ptarr+2=000000000061FDE8,000000000061FDE8

谁能解释一下?

【问题讨论】:

  • 请不要张贴文字、代码、错误信息等图片。复制文字并将其作为文字粘贴到问题中。
  • 这是十六进制。每个字节编码为 2 个字节
  • 输出显示两个数字,每个数字 8 字节,以 16 为基数(十六进制)表示。阅读base 16。一个字节包含 8 位;有 16 个十六进制数字,每个数字用 4 位表示。因此,在 base 16 中,一个字节正好用 2 个十六进制数字表示。
  • @Cy-4AH:指针大小由 C 实现决定,而不是由 CPU 架构决定。 CPU 和操作系统通常是典型 C 实现中的主要影响因素,但它们不是决定性的。我使用了一个在具有 64 位地址空间的系统中使用 32 位指针的 C 实现。它旨在使用由许多指针连接在一起的大量内存结构来减少进程的内存占用。另一个例子是特殊用途的 C 实现可能被设计为支持现代硬件中的旧环境,以便可以使用旧软件。
  • @Cy-4AH:正如我所写,C 实现在具有 64 位地址的系统中使用 32 位指针。 sizeof(char *) 产生了四个,但硬件指令使用 64 位作为地址。 C 中的指针和指令中的硬件地址可能是不同的东西。

标签: c pointers printf


【解决方案1】:

在每字节位数为 8 的平台上:

1个十六进制字符代表4位,即“半个字节”。

因此 16 个十六进制字符代表 8 个字节(不是 16 个字节)。


请注意,通常每个字节的位数由CHAR_BIT 定义。

所以在理论上,一个字节可以由 8 位以外的东西组成。

【讨论】:

    猜你喜欢
    • 2018-05-22
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2019-07-31
    • 2018-12-16
    • 2019-04-09
    • 1970-01-01
    相关资源
    最近更新 更多