当数组未完全填充时,内存中分配了什么? ( C )

问题描述 投票:-5回答:2

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

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

int this = sizeof(thisArray);

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

我究竟做错了什么?

c arrays memory
2个回答
4
投票

当您在没有显式初始化所有内容的情况下提供初始化程序时,未明确设置的任何内容都将设置为0。

C11标准第6.7.9节第21节:

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

此处引用的静态存储持续时间规则为6.7.9 p 10

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

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

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


1
投票

你没有做错任何事,你只需要重置你的期望。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.