【问题标题】:C: Why is this address of the char array 6 bytes?C:为什么这个char数组的地址是6字节?
【发布时间】:2020-09-30 08:59:38
【问题描述】:

我以为地址是 4 个字节大,为什么这个地址是 6 个字节?

我正在使用 Ubuntu 20.04 的虚拟机上使用 gcc 进行编译,如果这很重要,我有一个 x64 处理器。

#include <stdio.h>

int main() {

        char char_array[3] = {'a', 'b', 'c'};
        printf("Address of char_array: %p\n", char_array);
}
$ gcc -g test.c
$ ./a.out
Address of char_array: 0x7ffc0ff83645

【问题讨论】:

  • 在 64 位计算机上地址是否为 4 个字节?
  • 4 个字节只有 32 位。您现在处于 64 位世界!
  • 地址是8字节(因为是64位的电脑/程序),但是高2字节是0,仅此而已。
  • 6 个字节(显然)由于前导 0 抑制。
  • @FredLarson:哈哈——摩托罗拉 68000 的回声,它有一个 24 位地址总线。有进取心的 Macintosh 程序员通常会将数据填充到这 8 个未使用的位中,以充分利用宝贵的 128KB RAM。在 68020 推出之前一直运行良好,它具有 32 位地址总线,所有代码都必须重写。

标签: c memory-address


【解决方案1】:

首先,C 指针通常是 4 字节(32 位)或 8 字节(64 位),但这不能保证,也不应该假设。

其次,您不能计算十六进制内存地址中的位数,并假设位数除以 2 是系统用于指针的字节数,因为没有打印前导零。例如,如果您的内存地址是0x00000020,并且您使用%p 说明符将其传递给printf(),您将得到0x20 的输出。

如果您想知道系统中char* 的字节宽度,您应该尝试printf(“%zd\n”,sizeof(char*));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2015-08-29
    • 2013-01-19
    • 2015-09-29
    相关资源
    最近更新 更多