通过考虑将内存分为四个部分:数据,堆,堆栈和代码,全局变量,静态变量,常量数据类型,局部变量(在函数中定义和声明),变量(在main函数中),指针,并动态分配空间(使用malloc和calloc)存储在内存中?
我认为他们将分配如下:
-
全局变量------->数据
-
静态变量------->数据
-
常量数据类型----->代码
-
局部变量(在函数中声明和定义)--------> stack
-
在main函数-----> heap中声明和定义的变量
-
指针(例如,
char *arr
,int *arr
)------->堆 -
动态分配空间(使用malloc和calloc)--------> stack
我只是从C的角度来指这些变量 .
如果我错了,请纠正我,因为我是C的新手 .
7 回答
你有一些是正确的,但是写这些问题的人至少会欺骗你一个问题:
全局变量------->数据(正确)
静态变量------->数据(正确)
常量数据类型----->代码和/或数据 . 当一个常量本身存储在数据段中时,考虑字符串文字,并且对它的引用将嵌入到代码中
局部变量(在函数中声明和定义)--------> stack(正确)
在
main
函数中声明和定义的变量----->堆也堆栈(老师试图欺骗你)
指针(例如:
char *arr
,int *arr
)------->堆数据或堆栈,具体取决于上下文 . C允许您声明全局或static
指针,在这种情况下,指针本身将在数据段中结束 .动态分配空间(使用
malloc
,calloc
,realloc
)-------->堆栈堆值得一提的是“堆栈”被正式称为“自动存储类” .
对于那些可能有兴趣了解这些内存段的未来访问者,我在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;
将存储在未初始化的数据段中 .如果声明一个全局变量并将其初始化为
0
或NULL
,那么它仍会转到未初始化的数据段或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中,它使用
malloc
,calloc
或realloc
方法完成 .例如,当
int* prt = malloc(sizeof(int) * 2)
时,将在堆中分配八个字节,并且将返回该位置的内存地址并将其存储在ptr
变量中 .ptr
变量将位于堆栈或数据段上,具体取决于它的声明/使用方式 .Further reading
纠正了错误的句子
局部常量变量----->堆栈
初始化全局常量变量----->数据段
未初始化的全局常量变量-----> bss
在main函数-----> stack中声明和定义的变量
指针(例如:char * arr,int * arr)------->指针变量的大小将在堆栈中 .
考虑您正在动态分配n个字节的内存(使用
malloc
或calloc
),然后使指针变量指向它 . 现在n
字节的内存在堆中,而指针变量需要4个字节(如果是64位机器8个字节),它将在堆栈中存储内存块的n
字节的起始指针 .注意:指针变量可以指向任何段的内存 .
动态分配空间(使用malloc,calloc)-------->堆
一种流行的桌面架构将进程的虚拟内存分为几个部分:
文本段:包含可执行代码 . 指令指针采用此范围内的值 .
数据段:包含全局变量(即具有静态链接的对象) . 细分为只读数据(如字符串常量)和未初始化数据(“BSS”) .
堆栈段:包含程序的动态内存,即所有线程的空闲存储("heap")和本地堆栈帧 . 传统上C堆栈和C堆用于从相对的两端进入堆栈段,但我相信这种做法已被放弃,因为它太不安全了 .
C程序通常将具有静态存储持续时间的对象放入数据段,在自由存储上动态分配对象,并将自动对象放置在其所在的线程的调用堆栈中 .
在其他平台上,例如旧的x86实模式或嵌入式设备上,事情显然可能完全不同 .
从C语言的角度来看,重要的是范围,范围,联系和访问;具体如何将项映射到不同的内存段取决于各个实现,这将有所不同 . 语言标准根本不讨论内存段 . 大多数现代建筑的行为大致相同;块范围变量和函数参数将从堆栈中分配,文件范围和静态变量将从数据或代码段分配,动态内存将从堆中分配,一些常量数据将存储在只读段中等
不,他们可以在堆栈或数据段中 . 他们可以指向任何地方
变量/自动变量--->堆栈部分
动态分配变量--->堆部分
初始化全局变量 - >数据部分
未初始化的全局变量 - >数据部分(bss)
静态变量 - >数据部分
字符串常量 - >文本部分/代码部分
功能 - >文本部分/代码部分
文本代码 - >文本部分/代码部分
寄存器 - > CPU寄存器
命令行输入 - >环境/命令行部分
环境变量 - >环境/命令行部分