【问题标题】:What is allocated in memory when arrays aren't fully filled? ( C )当数组未完全填充时,内存中分配了什么? ( C )
【发布时间】:2019-04-05 17:45:28
【问题描述】:

我创建了一个这样的数组:int thisArray[20] = {0,1,2,3,4,5,6,7,8,9};

然后我创建了一个变量来存储数组的大小:

int this = sizeof(thisArray);

当我告诉程序打印 this 的值时,它显示的是 80 而不是 20。

我做错了什么?

【问题讨论】:

  • 大小是20个整数,因为你这么说。而一个 int 是 4 个字节,4*20=80。
  • sizeof 这是字节的大小,而不是元素的数量
  • int 的宽度为 4 字节,因此 20 ints 为 80 字节。
  • 要知道数组的元素个数使用sizeof(A)/sizeof(A[0])

标签: c arrays memory


【解决方案1】:

当你给一个初始化器而不显式初始化所有东西时,任何没有显式设置的东西都将被设置为 0。

C11 标准的第 6.7.9 节第 21 节:

如果大括号括起来的列表中的初始值设定项比那里少 是聚合的元素或成员,或 用于初始化已知大小的数组的字符串文字 是数组中的元素,聚合的其余部分 应隐式初始化,与具有静态的对象相同 存储期限。

这里引用的静态存储持续时间规则在 6.7.9 p 10

如果具有自动存储持续时间的对象不是 显式初始化,它的值是不确定的。如果 具有静态或线程存储持续时间的对象不是 显式初始化,然后:

  • 如果有指针类型,则初始化为空指针; - 如果 它具有算术类型,初始化为(正数或无符号数) 零;
  • 如果是聚合,每个成员都被初始化 (递归地)根据这些规则,并且任何填充都是 初始化为零位;
  • 如果是联合,则第一个命名的 根据这些规则(递归地)初始化成员,并且任何 填充被初始化为零位;

至于为什么你得到80 而不是20sizeof,因为在你的系统上一个 int 大概是 4 个字节,所以 20 * 4 = 80 个字节。

【讨论】:

    【解决方案2】:

    你没有做任何错误,你只需要重新设定你的期望。

    sizeof 计算为数组的大小以字节为单位,而不是元素的数量。您声明 thisArray 有 20 个类型为 int 的元素,并且您的系统上的 sizeof (int) 最好是 4。因此,sizeof 在此对象上的结果将是 80。

    有一个技巧可以获取数组中的元素个数:

    size_t elements = sizeof myArray / sizeof myArray[0];
    

    也就是说,您将数组的总大小(80 字节)除以单个元素的大小(在本例中为 4)。请注意,此技巧在第一个 sizeof 的操作数是 array 类型(即声明为 T arr[N])时才有效。如果它是 pointer 类型,那么这将不起作用 - 您将指针对象的大小除以数组元素的大小。

    【讨论】:

      猜你喜欢
      • 2014-09-07
      • 1970-01-01
      • 2013-10-07
      • 2023-02-22
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      相关资源
      最近更新 更多