dbc*_*ion 0 c arrays pointers memory-layout
由于C语言中没有数组这样的东西,以下是否都存储在一个内存位置,或者每个元素的值存储在内存位置的"数组"中?
int array[] = {11, 13, 17, 19};
Run Code Online (Sandbox Code Playgroud)
场景1
{11, 13, 17, 19} --> location A
Run Code Online (Sandbox Code Playgroud)情景2
{
11 --> location A
13 --> location B
17 --> location C
19 --> location D
}
Run Code Online (Sandbox Code Playgroud)哪一个是有效的内存布局?
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))的大小相同.