当前位置: 首页 > 知识库问答 >
问题:

一个数组存储在内存中的什么位置?

潘阳舒
2023-03-14
  1. 初始化数据段
  2. BSS
  3. 堆栈
  4. 代码

现在考虑以下程序:

#include <stdio.h>

int main(){
    int arr[4] = {1,2,3,4};
    int x = 10;

    printf("Hello World!");
}

在上面的程序中,arr和x都是在main函数内本地声明的。我认为这意味着它们都将在函数堆栈上分配空间。但是,当我在linux上运行size命令时,我发现实际上正在为数组分配数据段中的空间。

共有1个答案

吕新
2023-03-14

我已经在网上搜索了这个,但是发现了相互矛盾的信息。

请不要阅读随意的博客或诸如此类的,他们通常有不良的信息。在堆栈溢出问题上,错误的信息往往会被否决,或者至少通常会有注释指出错误和谬误。

在上面的程序中,arr和x都是在main函数内本地声明的。我认为这意味着它们都将在函数堆栈上分配空间。

C标准没有指定如何分配 variables 对象的内存。它只指定对象具有存储持续时间,存储持续时间定义 variable 对象的生存期

  • 静态的,它的生存期从程序的开始到结束
  • 自动,它将具有包含声明(或复合文字)的最内部块{...}的生存期,直到块结束
  • 线程本地,它将具有线程的生存期
  • 分配的对象,这些对象将从malloc/calloc/realloc/aligned_alloc一直活动到相应的free/realloc为止。

除此之外,C标准还规定,在其生存期内,对象将

  • 为其保留内存
  • 并具有恒定地址(您可以使用&运算符观察该地址)

除此之外,还有一个所谓的as-if规则,它说只要程序的外部行为相同,编译器就可以生成任何程序代码,外部行为意味着输入、输出、对易失性对象的访问等等。

程序中的变量具有自动存储持续时间,这意味着每次输入main函数时,都会有新的对象具有新的生存期,直到main函数结束。通常这意味着它们将存储在堆栈上,因为它将以最小的开销很好地处理分配和释放。但程序的外部行为与

#include <stdio.h>

int main(void) {
    printf("Hello World!");
}

它意味着编译器可以完全消除这两个变量,不为其保留任何空间。

现在,如果打印变量的地址:

#include <stdio.h>

int main(void) {
    int arr[4] = {1,2,3,4};
    int x = 10;

    printf("Hello World! %p, %p\n", (void *)arr, (void *)&x);
}

因为变量的地址被占用并用于输出,所以C无法优化它们。他们现在在堆栈上吗?嗯,C标准没有说。它们至少需要从main开始直到结束的生存期--但是C编译器可以决定不对它们使用堆栈,因为该程序的外部行为与

#include <stdio.h>

static int arr[4] = {1,2,3,4};
static int x = 10;
    
int main(void) {
    printf("Hello World! %p, %p\n", (void *)arr, (void *)&x);
}
 类似资料:
  • JVM内存分为:1.方法区2.堆区3.堆栈4.PC寄存器5.本机堆栈 > 现在假设我有一个属性为“int[]dealCodes”(int基元数组)的类。根据内存管理,一旦处理代码初始化,内存中就会有连续内存分配(total_elements*4字节)。所以,如果数组大小为10,则JVM内存中有40字节的分配。 我的问题是,这40个字节将分配到哪个区域(堆还是堆栈)? 我对数组的理解是:它就像任何其

  • 问题内容: 在任何Web浏览器中,执行以下脚本都会导致将其发送到控制台。在Node中发送。 我意识到在这种情况下,在Node中引用导出对象。我确实知道该变量,而这不是我要访问的变量。此外,以上脚本也未在全局对象上设置。到底去哪儿了?我可以在上面的脚本中显式访问它,但似乎完全没有理由将其藏在某些非标准空间中。 我还意识到,删除对象上的will声明是预期的行为,尽管在顶级范围内将其值存储在与“ nak

  • 主要内容:程序员的幽默计算机要处理的信息是多种多样的,如数字、文字、符号、图形、音频、视频等,这些信息在人们的眼里是不同的。但对于计算机来说,它们在内存中都是一样的,都是以二进制的形式来表示。 要想学习编程,就必须了解二进制,它是计算机处理数据的基础。 内存条是一个非常精密的部件,包含了上亿个电子元器件,它们很小,达到了纳米级别。这些元器件,实际上就是电路;电路的电压会变化,要么是 0V,要么是 5V,只有这两种电压。

  • 如果我将数组创建为: 那么< code>number[j]中存储的值是什么,其中< code>j=8,9。如果存储了一些值,那么为什么存储这些值以及如何存储这些值??

  • 问题内容: 我试图了解Java中的数组设置。创建数组后,为什么必须为数组中的每个对象初始化空间。它是如何存储在内存中的,如下所示: 或像这样: 换句话说,实际上是在内存中执行的操作。是否仅返回对内存中保留位置的引用,并且该语句沿10个指针的行创建内容,这些指针随后由新语句分配? 问题答案: 阵列,Java软件商店的两件事情之一:要么基本值(,,…)或引用(又名指针)。 因此,仅为10个引用创建空间

  • 前面学习 数据结构的过程中,总是使用数组作为 顺序表的底层实现,给我们一种 "数据结构中,数组的作用就是实现顺序表" 的错误认识。其实,数组的作用远不止于此。 本节将从数据结构的角度讲解 数组存储结构。 本节所讲的数组,要将其视为一种存储结构,与平时使用的数组基本数据类型区分开。 一说起数组,我们的印象中数组往往是某一门编程语言中包含的具体数据类型,其实不然。 从本质上讲,数组与顺序表、 链表、