数组是如何存储在内存中的?

Posted

技术标签:

【中文标题】数组是如何存储在内存中的?【英文标题】:How is the array stored in memory? 【发布时间】:2012-05-28 14:08:50 【问题描述】:

我有一个简单的程序将数组初始化为:

int a[]=10,20,30,40,50;   
char *p;
p=(char*)a;

现在我想通过指针p 访问每个字节的值。为此我需要知道:是存储在栈上还是堆上?

【问题讨论】:

也许我遗漏了一些东西,但是为什么你需要知道它是存储在堆栈中还是堆中呢?你试过 p[0] 吗?也许您可以通过说出您遇到的问题来提出问题,以便我们有一个起点...... 正如@Ray 所说,这取决于您在做什么,这可能“无关紧要”......并且可能以各种方式依赖于编译器,由您可以执行的操作而不是实现定义细节。无论哪种方式,这些并不是唯一的两类存储......至少在 C++ 中(刚刚注意到这是一个 C 问题,我对 C 的形式化知之甚少......其他人可能有更合适的链接。 ) 不过,这可能很有用:gotw.ca/gotw/009.htm “这种问题真的是 C 的全部内容”——不,不是。 “为什么你需要知道它是存储在堆栈中还是堆中?” ——没有说明这种需要。问题似乎与字节顺序有关。 @som,为什么要访问 int 数组的字节?您将获得的字节数是 sizeof(a)*sizeof(int),它们的顺序取决于机器架构。 【参考方案1】:

数组将其元素存储在连续的内存位置。 如果您在本地创建了数组,它将在堆栈上。元素的存储位置取决于存储规范。 例如: 全局或静态声明的数组将具有与本地声明的数组不同的存储规范。从技术上讲,where 部分是实现定义,但通常实现会使用类似的使用模式。

本地数组将(通常)在堆栈上创建,而 全局或静态数组将(通常)在bss/数据段和上创建李> 动态创建的数组将在上创建。

【讨论】:

【参考方案2】:

由于我还不能添加 cmets,所以这是我的两分钱的答案:

如果您只想知道内存是在堆栈上还是在堆上,请阅读其他答案,他们比我更了解。

如果您想知道值的确切位置,您可以随时打印地址:

printf("address at a[0] = %p\n", (void *)&a[0]);
printf("address at p[0] = %p\n", (void *)&p[0]);

您会注意到相同的答案。但是,再看看

printf("address at a[1] = %p\n", (void *)&a[1]);
printf("address at p[1] = %p\n", (void *)&p[1]);

这是一个有趣的小练习。 只是为了好玩,运行以下代码,看看你得到了什么:

 p[2] = 'a';
 printf("a[0] is %d\n", a[0]);
 printf("a[1] is %d\n", a[1]);
 printf("p[2] is %d\n", p[2]);
 putchar(p[2]);

【讨论】:

+1 表示对 SO 不熟悉并建议进行实验,这是探索和调查的好方法。尽管如此,人们应该永远记住编译器是不同的。因此,仅仅因为您在实验中观察到一种模式并不意味着它是“真理”。唯一的“真相”在于规范的措辞,这使得 some 保证......但除了编译器错误之外,规范仍然严重依赖于“未定义行为”的拐杖。此外,成语是“两分钱”(如金钱)......不是“两义”,尽管这很有趣。 :) en.wikipedia.org/wiki/Undefined_behavior @HostileFork 你的观点很好。我已经决定,作为一个新程序员,因为谷歌似乎总是把我指向所以我应该加入!很好地抓住“美分”!【参考方案3】:

静态创建的数组将位于堆栈或二进制文件的 .data/.bss 部分中。将在堆上分配一个动态创建的数组(newmalloc)。

【讨论】:

【参考方案4】:

首先,您的指针必须是 int 类型。 数组只是一组整数,作为单个整数保存在内存中,但在一行中。 一个整数在内存中有 4 个字节,因此您可以通过将指针增加 4 来访问数组的每个值。

int *p = (int*)a;
for(i = 0; i < 5; i++) 
    p += 4;
    printf("%d ", *p);

【讨论】:

由于 OP 说他/她想要访问每个字节,并明确使用了 char* 指针和 char* 强制转换,因此说指针必须是 int 类型是没有意义的。此外,int 不一定是 4 个字节,将 4 加到指针上是非常错误的,因为加数乘以 int 的大小。

以上是关于数组是如何存储在内存中的?的主要内容,如果未能解决你的问题,请参考以下文章

数组存储在内存中的啥位置?

3D 数组如何存储在 C 中?

数据结构——1数组

附加到动态内存中的数组

C / C ++如何将3维数组存储在内存中以及遍历它的最快方法是啥

数组及其在内存中的分配