gpt4 book ai didi

c - 数组在内存中存储在哪里?

转载 作者:行者123 更新时间:2023-12-03 16:10:16 31 4
gpt4 key购买 nike

我试图了解如何在C程序中管理内存。我知道内存中包含以下部分:

  • 初始化的数据段
  • BSS
  • 堆栈
  • 代码

  • 现在考虑以下程序:
    #include <stdio.h>

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

    printf("Hello World!");
    }

    在上面的程序中,arr和x都在main函数中本地声明。我认为这将意味着它们都将在函数堆栈上分配空间。
    但是,当我在linux上运行size命令时,我发现该数组实际上是在数据段中分配的空间。
    我在网上搜索了此信息,但发现有冲突的信息。一些回答说所有本地声明的变量都应进入堆栈,而另一些回答则说该数组应进入堆。我认为如果使用malloc为内存动态分配了内存,则数组会进入堆,在此示例中情况并非如此。

    最佳答案

    I have searched for this online but have found conflicting information.


    请不要阅读随机博客或此类博客,因为它们通常包含不良信息。在Stack Overflow上,错误的信息倾向于被低估,或者至少通常会带有指出错误和谬误的注释。

    In the above program, both arr and x are locally declared within the main function. I thought that this would mean that they would both be allocated space on the function stack.


    C标准未指定应如何分配变量对象的内存。它仅指定对象具有存储期限,该期限定义了变量对象的生存期
  • 静态,从程序开始到结尾
  • 都有生命周期
  • 自动,它将具有包含声明(或复合文字)的最里面的块{ ... }的生存期,直到块
  • 结束
  • 线程本地,它将具有线程
  • 的生命周期
  • 分配的对象,这些对象将从malloc/calloc/realloc/aligned_alloc一直存在,直到对应的free/realloc为止。

  • 除此之外,C标准还规定了对象在其生命周期内
  • 为其保留了内存
  • 并具有一个常量地址(您可以使用&运算符进行观察)

  • 现在,除此之外,还有一条 the so-called 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);
    }
    将这些变量放在静态数据段中;当然,地址会有所不同,但是C仍然不能保证特定对象在内存中的位置,只是它们将具有地址。

    关于c - 数组在内存中存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64166347/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com