"数组"元素值是存储在一个位置还是存储在不同的位置?

dbc*_*ion 0 c arrays pointers memory-layout

由于C语言中没有数组这样的东西,以下是否都存储在一个内存位置,或者每个元素的值存储在内存位置的"数组"中?

int array[] = {11, 13, 17, 19};
Run Code Online (Sandbox Code Playgroud)

哪一个是有效的内存布局?

Sou*_*osh 7

C明确地将"数组"定义为类型.

引用C11,章节§6.2.5,类型(强调我的)

数组类型描述了具有特定成员对象类型连续分配的非空对象集,称为元素类型.只要指定了数组类型,元素类型就应该是完整的.数组类型的特征在于它们的元素类型和数组中的元素数.数组类型据说是从其元素类型派生的,如果它的元素类型是T,则数组类型有时称为''T'数组.从元素类型构造数组类型称为"数组类型派生".

简而言之,答案是,数组元素存储在单独但连续的位置.

假设我们已经声明了一个5的数组int:

int arr[5];
Run Code Online (Sandbox Code Playgroud)

然后,在一个整数大小为2个字节(szeof(int) ==2)的平台上,该数组的元素组织如下:

在此输入图像描述

在不同的平台上sizeof(int) == 4,它可能是:

在此输入图像描述

所以表示

{
    11 --> location A
    13 --> location B
    17 --> location C
    19 --> location D
}
Run Code Online (Sandbox Code Playgroud)

是有效的,综合考虑B == A + 1,C == B + 1等等.

在这里,请注意,指针算法关于数据类型,因此A+1不会产生1 byte增量的地址,而是增量为1 element.换句话说,两个连续元素的地址之间的差异将与数据类型(sizeof (datatype))的大小相同.

  • @ user3528438我没有写这个答案,但我不理解您的反对意见。“元素之间没有缝隙,这是对是假” –您甚至是什么意思?这是不正确的,因为*标准指定*分配是“连续的”,因此实际上没有任何间隙,除非通过“间隙”包含*填充*。但是填充是数组每个元素的一部分,而不是元素之间。 (2认同)
  • @ user3528438啊,我现在明白你的观点,谢谢你们的努力.现在改变它. (2认同)