C 在运行时之前,初始化的数据段值将存储在哪里?

C 在运行时之前,初始化的数据段值将存储在哪里?,c,memory,memory-management,C,Memory,Memory Management,通常,C代码中的数据段驻留在RAM易失性内存中,由初始化数据段、未初始化数据段(.BSS)、堆栈内存和堆组成 堆栈内存只有在运行时调用例程和值的推拉操作中才会出现 Heap用于动态内存分配调用malloc、calloc和realloc .BSS段只有memset或函数内部的值,因为它没有任何真正的初始值 但是,初始化的数据段即使是静态的或全局的,也必须具有一些值,并且这些值需要存储在非易失性内存位置,因为在代码运行之前应该存在这些值 问题: 该初始化值存储在非易失性内存位置的哪个部分,以及我们是

通常,C代码中的数据段驻留在RAM易失性内存中,由初始化数据段、未初始化数据段(.BSS)、堆栈内存和堆组成

  • 堆栈内存只有在运行时调用例程和值的推拉操作中才会出现

  • Heap用于动态内存分配调用
    malloc
    calloc
    realloc

  • .BSS段只有memset或函数内部的值,因为它没有任何真正的初始值

  • 但是,初始化的数据段即使是静态的或全局的,也必须具有一些值,并且这些值需要存储在非易失性内存位置,因为在代码运行之前应该存在这些值

  • 问题:
    该初始化值存储在非易失性内存位置的哪个部分,以及我们是否可以使用任何方法来减少该位置的内存消耗?

    以下两个图表有助于理解c二进制文件的内存布局


    请参阅:

    您是否提到闪存中会有一个初始化的数据段块,如您在.data中所述,它将由引导加载程序复制到RAM中。是的。。禁用任何二进制文件。。您将看到上面的结构,即文本、.data、.bss、.rodata等。我希望bss不是必需的,在您的图表中也没有提及。到处都提到rodata常量,但我对此感到困惑。非常感谢您提供的信息。这是通用的还是仅适用于ARM处理器?如果控制器的整个内存是连续的,即代码段和数据段又如何呢?在代码中,使该数据段在运行时进行初始化是否更好,以便当它成为冗余块时,可以从ROM中保存内存?没有“通用块”,因为每个体系结构都有自己的内存组织。C标准没有介绍什么是“堆栈”和“堆”——一个非常有效的实现可以实现一个使用“堆”的
    malloc
    。您的问题非常依赖于架构。有哈佛和纽曼体系结构,所有体系结构上都运行C代码。在进程运行时,初始化的数据不会存储在非易失性内存中,但会与RAM中的其余段一起存储。如果控制器关闭并通电,那么谁会将这些数据加载到RAM内存?当进程从非易失性内存加载时像硬盘可执行文件一样,初始化数据也会随之出现