因为C语言中没有数组这样的东西,所以下面的所有内容都存储在一个内存位置中,还是每个元素的值都存储在内存位置的“数组”中?
int array[] = {11, 13, 17, 19};哪个是有效的内存布局?
发布于 2016-11-01 16:37:21
C显式地将“数组”定义为.类型。
引用C11,第6.2.5节,类型(强调地雷)
数组类型描述具有特定成员对象类型(称为元素类型的)的连续分配的非空对象集。只要指定了数组类型,元素类型就应该完成。数组类型的特征是它们的元素类型和数组中的元素数。数组类型被认为是从它的元素类型派生出来的,如果它的元素类型是T,则数组类型有时被称为‘数组T’。从元素类型构造数组类型称为“数组类型派生”。
简而言之,答案是,数组元素存储在单独但相邻的位置。
假设我们已经声明了一个5 int的数组
int arr[5];然后,在整数大小为2字节(szeof(int) ==2)的平台上,数组的元素组织如下:

在另一个平台上,在sizeof(int) == 4上,它可以是:

所以表示
{
11 --> location A
13 --> location B
17 --> location C
19 --> location D
}是有效的,考虑到B == A + 1、C == B + 1等。
在这里,请注意,指针算法考虑数据类型,因此A+1将不会产生一个具有1 byte增量的地址,而是由一个element增加。换句话说,两个连续元素的地址之间的差异将与数据类型(sizeof (datatype))的大小相同。
发布于 2016-11-01 16:37:46
元素将位于相邻的内存位置。
设array[0]位于位置B,数组的每个元素的大小,即sizeof(int),是S。
array[0] at B
array[1] at B + S
array[2] at B + 2S
..
array[n] at B + n*S发布于 2016-11-01 16:38:03
编译器在特定的连续位置分配数组。
您还可以使用下一段代码检查它:
#include <stdio.h>
void main()
{
int array[] = {11, 13, 17, 19};
for (int i = 0; i < 4; i++)
printf("0x%p ", &array[i]);
}给出十六进制地址。
0x14fee0 0x14fee4 0x14fee8 0x14feec每个元素的边距为4个字节时,int的大小。
通常,您可以将指向数组中一个元素的指针,例如索引m,并将其添加为n作为多个元素,并在数组中获取指向n+m索引的指针。
*(array + n) == array[n]https://stackoverflow.com/questions/40364357
复制相似问题