【问题标题】:why does int *b[5] forms a difference of 8 bits instead of 4?为什么 int *b[5] 形成 8 位而不是 4 位的差异?
【发布时间】:2018-06-21 08:03:56
【问题描述】:

我编写了一个程序来理解 指针 的概念,我在其中声明了一个 5 个整数指针的数组,然后我尝试打印各种索引的地址大批。但我不明白的是,为什么输出中 8 位索引的连续地址与 4 位索引的连续地址之间存在差异?

我的代码是:

#include<stdio.h>
void main()
{
    int i;
    int *b[5];

    for(i = 0; i < 5; i++){
        b[i] = (int *) malloc(10 * (sizeof(int)));}
    printf(" b = %u \n\n",b);
    printf(" (b+1) = %u \n\n", (b+1));
    printf(" (b+2) = %u \n\n", (b+2));
    printf(" *(b+2) = %u \n\n", *(b+2));
    printf(" *(b+2)+3) = %u \n\n", *(b+2) + 3);
    *(*(b+2) + 3) = 5;
    printf(" b[2][3] = %u \n\n", b[2][3]);
}

输出如下

b = 79107440 

 (b+1) = 79107448 

 (b+2) = 79107456 

 *(b+2) = 3293532864 

 *(b+2)+3) = 3293532876 

 b[2][3] = 3293533008 

显然 (b+1) 和 b 之间的差异是 8 位。为什么?

【问题讨论】:

  • 你的处理器是什么?
  • 英特尔酷睿 i3-2330M 处理器 2.20 GHz
  • 对我来说,忽略所有编译器警告的代码显示:0、0、0、0、0 和 0。64 位大端万岁。使用 %p 显示指针。

标签: c arrays pointers integer memory-address


【解决方案1】:

首先,地址以字节为单位,而不是位。其次,为什么差异是 8 个字节,那是因为您在使用 64 位(8 字节)地址的系统上。

【讨论】:

    【解决方案2】:

    int *b[5] 是 int 上的指针数组,因此 bb + 1 之间的差异等于 sizeof(int*) 女巫在你的电脑上是 8 个字节

    【讨论】:

    • 谢谢您,先生,感谢您帮助我消除困惑。
    【解决方案3】:

    首先,您可以使用 %p 来显示指针的地址,而不是 %u。实际上,%d 是有符号整数,而 %u 是无符号整数,而 %p 是指针。

    关于答案,在您的机器上,int 显然是 4 个字节,但指针是 8 个字节(典型的 64 位机器)。

    【讨论】:

    • 这应该是一个评论,而不是一个答案,除非最后一句话是为了回答这个问题。如果是这样,答案应该重新措辞,以便清楚并且是第一位的。
    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 2020-02-04
    • 2021-08-27
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2018-01-09
    相关资源
    最近更新 更多