首页 文章

在内存中我的变量存储在C中?

提问于
浏览
115

通过考虑将内存分为四个部分:数据,堆,堆栈和代码,全局变量,静态变量,常量数据类型,局部变量(在函数中定义和声明),变量(在main函数中),指针,并动态分配空间(使用malloc和calloc)存储在内存中?

我认为他们将分配如下:

  • 全局变量------->数据

  • 静态变量------->数据

  • 常量数据类型----->代码

  • 局部变量(在函数中声明和定义)--------> stack

  • 在main函数-----> heap中声明和定义的变量

  • 指针(例如, char *arrint *arr )------->堆

  • 动态分配空间(使用malloc和calloc)--------> stack

我只是从C的角度来指这些变量 .

如果我错了,请纠正我,因为我是C的新手 .

7 回答

  • 5

    你有一些是正确的,但是写这些问题的人至少会欺骗你一个问题:

    • 全局变量------->数据(正确)

    • 静态变量------->数据(正确)

    • 常量数据类型----->代码和/或数据 . 当一个常量本身存储在数据段中时,考虑字符串文字,并且对它的引用将嵌入到代码中

    • 局部变量(在函数中声明和定义)--------> stack(正确)
      main 函数中声明和定义的

    • 变量----->堆也堆栈(老师试图欺骗你)

    • 指针(例如: char *arrint *arr )------->堆数据或堆栈,具体取决于上下文 . C允许您声明全局或 static 指针,在这种情况下,指针本身将在数据段中结束 .

    • 动态分配空间(使用 malloccallocrealloc )-------->堆栈堆

    值得一提的是“堆栈”被正式称为“自动存储类” .

  • 157

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

    Some heads up:

    • 每当执行C程序时,在RAM中分配一些内存用于程序执行 . 该存储器用于存储频繁执行的代码(二进制数据),程序变量等 . 以下内存段说明相同:

    • 通常有三种类型的变量:

    • 局部变量(在C中也称为自动变量)

    • 全局变量

    • 静态变量

    • 您可以拥有全局静态或本地静态变量,但以上三个是父类型 .

    5 Memory Segments in C:

    1.代码段

    • 代码段,也称为文本段,是包含频繁执行的代码的内存区域 .

    • 代码段通常是只读的,以避免因缓冲区溢出等编程错误而被覆盖的风险 .

    • 代码段不包含程序变量,如局部变量(在C中也称为自动变量),全局变量等 .

    • 基于C实现,代码段还可以包含只读字符串文字 . 例如,当您执行 printf("Hello, world") 时,将在代码/文本段中创建字符串"Hello, world" . 您可以在Linux OS中使用 size 命令对此进行验证 .

    • Further reading

    数据段

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

    2.未初始化的数据段

    • 此段也称为 bss .

    • 这是内存的一部分,包含:

    • Uninitialized global variables (including pointer variables)

    • Uninitialized constant global variables .

    • Uninitialized local static variables .

    • 未初始化的任何全局或静态局部变量将存储在未初始化的数据段中

    • 例如:全局变量 int globalVar; 或静态局部变量 static int localStatic; 将存储在未初始化的数据段中 .

    • 如果声明一个全局变量并将其初始化为 0NULL ,那么它仍会转到未初始化的数据段或bss .

    • Further reading

    3.初始化数据段

    • 此段存储:

    • Initialized global variables (including pointer variables)

    • Initialized constant global variables .

    • Initialized local static variables .

    • 例如:全局变量 int globalVar = 1; 或静态局部变量 static int localStatic = 1; 将存储在初始化数据段中 .

    • 此段可以是 further classified into initialized read-only area and initialized read-write area . 初始化的常量全局变量将进入初始化的只读区域,而其值可在运行时修改的变量将进入初始化的读写区域 .

    • The size of this segment is determined by the size of the values in the program's source code, and does not change at run time .

    • Further reading

    4.堆栈段

    • 堆栈段用于存储在函数内部创建的变量(函数可以是主函数或用户定义函数),变量如

    • Local variables 函数 (including pointer variables)

    • Arguments passed to function

    • Return address

    • 函数执行完成后,将删除存储在堆栈中的变量 .

    • Further reading

    5.堆段

    • 此段用于支持动态内存分配 . 如果程序员想要动态分配一些内存,那么在C中,它使用 malloccallocrealloc 方法完成 .

    • 例如,当 int* prt = malloc(sizeof(int) * 2) 时,将在堆中分配八个字节,并且将返回该位置的内存地址并将其存储在 ptr 变量中 . ptr 变量将位于堆栈或数据段上,具体取决于它的声明/使用方式 .

    • Further reading

  • 1

    纠正了错误的句子

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

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

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

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

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

    在main函数-----> stack中声明和定义的变量

    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)-------->堆

  • 8

    一种流行的桌面架构将进程的虚拟内存分为几个部分:

    • 文本段:包含可执行代码 . 指令指针采用此范围内的值 .

    • 数据段:包含全局变量(即具有静态链接的对象) . 细分为只读数据(如字符串常量)和未初始化数据(“BSS”) .

    • 堆栈段:包含程序的动态内存,即所有线程的空闲存储("heap")和本地堆栈帧 . 传统上C堆栈和C堆用于从相对的两端进入堆栈段,但我相信这种做法已被放弃,因为它太不安全了 .

    C程序通常将具有静态存储持续时间的对象放入数据段,在自由存储上动态分配对象,并将自动对象放置在其所在的线程的调用堆栈中 .

    在其他平台上,例如旧的x86实模式或嵌入式设备上,事情显然可能完全不同 .

  • 6

    我只是从C角度提到这些变量 .

    从C语言的角度来看,重要的是范围,范围,联系和访问;具体如何将项映射到不同的内存段取决于各个实现,这将有所不同 . 语言标准根本不讨论内存段 . 大多数现代建筑的行为大致相同;块范围变量和函数参数将从堆栈中分配,文件范围和静态变量将从数据或代码段分配,动态内存将从堆中分配,一些常量数据将存储在只读段中等

  • 89

    指针(例如:char * arr,int * arr)------->堆

    不,他们可以在堆栈或数据段中 . 他们可以指向任何地方

  • 1
    • 变量/自动变量--->堆栈部分

    • 动态分配变量--->堆部分

    • 初始化全局变量 - >数据部分

    • 未初始化的全局变量 - >数据部分(bss)

    • 静态变量 - >数据部分

    • 字符串常量 - >文本部分/代码部分

    • 功能 - >文本部分/代码部分

    • 文本代码 - >文本部分/代码部分

    • 寄存器 - > CPU寄存器

    • 命令行输入 - >环境/命令行部分

    • 环境变量 - >环境/命令行部分

相关问题