内存中的位置是我的变量存储在C中?


你有这些权利,但是谁写这些问题至少欺骗了你一个问题:

  • 全局变量------->数据(正确)
  • 静态变量------->数据(正确)
  • 常数数据类型----->代码和/或数据。 当一个常量本身存储在数据段中时,考虑字符串文字,并且引用它将嵌入代码中
  • 局部变量(在函数中声明和定义)-------->堆栈(正确)
  • main函数中声明和定义的变量----->堆也堆栈(老师试图欺骗你)
  • 指针(例如: char *arrint *arr )------->堆数据或堆栈,取决于上下文。 C可以让你声明一个全局或static指针,在这种情况下,指针本身最终会在数据段中出现。
  • 动态分配空间(使用malloccallocrealloc )-------->栈堆
  • 值得一提的是,“堆栈”被正式称为“自动存储类”。


    对于那些有兴趣了解这些内存段的未来访问者,我写了关于C中5个内存段的重要观点:

    有些人抬起头来:

  • 无论何时执行C程序,都会在RAM中分配一些内存以供程序执行。 该存储器用于存储经常执行的代码(二进制数据),程序变量等。下面的存储器段说明了相同的情况:
  • 通常有三种类型的变量:
  • 局部变量(在C中也称为自动变量)
  • 全局变量
  • 静态变量
  • 您可以拥有全局静态或局部静态变量,但上述三个是父类型。
  • 5个内存段C:

    1.代码段

  • 代码段也称为文本段,是包含经常执行代码的内存区域。
  • 代码段通常是只读的,以避免编程错误(如缓冲区溢出等)而被覆盖的风险。
  • 代码段不包含程序变量,如本地变量(也称为C中的自动变量),全局变量等。
  • 基于C实现,代码段也可以包含只读字符串文字。 例如,当您执行printf("Hello, world")字符串“Hello,world”会在代码/文本段中创建。 您可以在Linux操作系统中使用size命令验证这一点。
  • 进一步阅读
  • 数据段

    数据段分为以下两部分,通常位于堆区之下,或者位于堆栈之上的某些实现中,但数据段永远不会位于堆栈和堆栈区之间。

    2.未初始化的数据段

  • 这部分也被称为bss
  • 这是包含以下内容的内存部分:
  • 未初始化的全局变量 (包括指针变量)
  • 未初始化的常量全局变量
  • 未初始化的本地静态变量
  • 未初始化的全局或静态局部变量将存储在未初始化的数据段中
  • 例如:全局变量int globalVar; 或静态局部变量static int localStatic; 将被存储在未初始化的数据段中。
  • 如果你声明一个全局变量并将其初始化为0NULL那么它仍然会转到未初始化的数据段或bss。
  • 进一步阅读
  • 3.初始化的数据段

  • 此细分商店存储:
  • 初始化的全局变量 (包括指针变量)
  • 初始化常量全局变量
  • 初始化本地静态变量
  • 例如:全局变量int globalVar = 1; 或静态局部变量static int localStatic = 1; 将存储在已初始化的数据段中。
  • 该段可以进一步分为初始化只读区域和初始化读写区域 。 初始化的常量全局变量将进入初始化的只读区域,而其值可在运行时修改的变量将进入初始化的读写区域。
  • 该段的大小由程序源代码中值的大小决定,并且在运行时不会改变
  • 进一步阅读
  • 4.堆栈段

  • 堆栈段用于存储在函数内部创建的变量(函数可以是主函数或用户定义函数),变量类似
  • 函数的局部变量 (包括指针变量)
  • 传递给函数的参数
  • 退货地址
  • 一旦函数执行完成,存储在堆栈中的变量将被删除。
  • 进一步阅读
  • 5.堆段

  • 这部分是为了支持动态内存分配。 如果程序员想要动态分配一些内存,那么在C中使用malloccallocrealloc方法完成。
  • 例如,当int* prt = malloc(sizeof(int) * 2)将在堆中分配八个字节,并且该位置的内存地址将被返回并存储在ptr变量中。 根据声明/使用的方式, ptr变量将位于堆栈或数据段中。
  • 进一步阅读

  • 更正了你错误的句子

    constant data types ----->  code //wrong
    

    局部常量变量----->堆栈

    初始化全局常量变量----->数据段

    未初始化的全局常量变量-----> bss

    variables declared and defined in main function  ----->  heap //wrong
    

    在主函数----->堆栈中声明和定义的变量

    pointers(ex:char *arr,int *arr) ------->  heap //wrong
    
    dynamically allocated space(using malloc,calloc) --------> stack //wrong
    

    指针(例如:char * arr,int * arr)------->指针变量的大小将在堆栈中。

    考虑你动态分配n字节的内存(使用malloccalloc ),然后使指针变量指向它。 现在n个字节的内存在堆中,并且指针变量请求4个字节(如果是64位机器8个字节),它们将堆栈以存储内存块的n个字节的起始指针。

    注意:指针变量可以指向任何段的内存。

    int x = 10;
    void func()
    {
    int a = 0;
    int *p = &a: //Now its pointing the memory of stack
    int *p2 = &x; //Now its pointing the memory of data segment
    chat *name = "ashok" //Now its pointing the constant string literal 
                         //which is actually present in text segment.
    char *name2 = malloc(10); //Now its pointing memory in heap
    ...
    }
    

    动态分配的空间(使用malloc,calloc)-------->堆

    链接地址: http://www.djcxy.com/p/2337.html

    上一篇: Where in memory are my variables stored in C?

    下一篇: Proper stack and heap usage in C++?