【问题标题】:Memory address increasing by four内存地址增加四
【发布时间】:2014-01-07 09:54:35
【问题描述】:

我正在做一个指针练习,在试验代码时遇到了一个疑问。为什么数组中的这些内存地址都增加了4?

例如我的输出是

Value of var[0] = 2686720

Value of var[1] = 2686724

Value of var[2] = 2686728

代码如下:

#include <stdio.h>
#include <conio.h>
main ()
{
  int var[3]= {10,100,200};
  int *ptr[3],i;

  for (i = 0; i < 3; i++)
  {
    ptr[i] = &var[i]; // assign the address of integer.
  }
  for (i = 0; i < 3; i++)
  {
    printf("\n\nValue of var[%d] = ",i);
    printf("%d",ptr[i]);               //var[0]=10  var[1]=100   var[2]=200
  }
  getch();
  return 0;
}

【问题讨论】:

  • 如果您的实际意思是“地址”,为什么还要在输出中写“值”?我想这让每个人都感到困惑。

标签: c arrays pointers allocation memory-address


【解决方案1】:

首先var[i]int 类型的数组。因此,该数组的每个元素将占用每个 int 的大小。 int 的大小为 4 字节。

接下来,您正在使用ptr[i] 来保存var 数组的元素地址。因此,对于每个元素,ptr [i]value 增加了 4

这里,为了更好地理解,在处理指针时应该使用"%p""0x%x" 格式说明符和printf()

另外,你应该改变打印语句

printf("\n\nValue of var[%d] = ",i);

printf("\n\nAddress of var[%d] = ",i);

因为前者传达了错误的信息。实际上输出值是var[i]地址。如果要使用ptr[i]打印var[i]的值,可以考虑使用*ptr[i]

【讨论】:

  • 迂腐旁注:"The size of an int is 4 bytes" 应该是: Int 的大小几乎总是 4 个字节,但保证在按照标准,至少 2 个字节。不过,在 99/99% 的情况下,它将是 4 个字节。也许考虑在int32_t 上添加注释,就像我在回答中所做的那样
【解决方案2】:

内存的每个字节都与一个地址相关联。在您的情况下,数组的每个元素在内存中占用 4 个字节,该元素的地址是它的第一个字节的地址。

所以在你的情况下,内存看起来像这样:

         Memory                Address

    |0|0|0|0|0|0|0|0|    <-    2686720   ( &var[0] )
    |0|0|0|0|0|0|0|0|    <-    2686721
    |0|0|0|0|0|0|0|0|    <-    2686722
    |0|0|0|0|1|0|1|0|    <-    2686723

    |0|0|0|0|0|0|0|0|    <-    2686724   ( &var[1] )
    |0|0|0|0|0|0|0|0|    <-    2686725
    |0|0|0|0|0|0|0|0|    <-    2686726
    |0|1|1|0|0|1|0|0|    <-    2686727

    |0|0|0|0|0|0|0|0|    <-    2686728   ( &var[2] )
    |0|0|0|0|0|0|0|0|    <-    2686729
    |0|0|0|0|0|0|1|1|    <-    2686730
    |1|1|1|0|1|0|0|0|    <-    2686731

这意味着通过从一个元素传递到下一个元素,将地址增加sizeof(type),在本例中为sizeof(*ptr[i]) == sizeof(int)

【讨论】:

  • 一个 int 并不总是占用 4 个字节,它可以取决于实现/架构...唯一确定的方法是使用 sizeof(int)。在过去,sizeof(int) 通常是 2(16 位),并且规范只定义了 最小 范围,这就是 C99 增加 int16_tint32_t 类型的原因
  • @EliasVanOotegem 在 32 位系统中,它是 4 字节,因为提问者说它增加了 4,所以就是这种情况!
  • 是的,我知道在 OP 的情况下,整数是 4 个字节宽,但鉴于 SO 旨在为未来用户提供参考,重要的是要注意标准 不强制使用 4 字节整数。考虑到 C 代码一直意味着尽可能可移植,我想指出更一致(因此更可靠且更可移植)的类型 int16_tint32_t,也是
  • 我在回答中提到过,是32位系统的情况。我还提到了底部int16_t的情况
  • 没有保证的4字节整数!不在 32 位系统上,不在 64 位系统上。规范保证 至少 2 个字节,16 位 对于 int,不多不少。 See the types here
猜你喜欢
  • 2012-10-19
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2019-11-03
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
相关资源
最近更新 更多