内存中的位置是我的variables存储在C?
通过考虑内存分为四个部分:数据,堆,堆栈和代码,全局variables,静态variables,常量数据types,局部variables(在函数中定义和声明),variables(在主函数中),指针,并dynamic分配空间(使用malloc和calloc)获取存储在内存中?
我认为他们将被分配如下:
- 全局variables——-> 堆 (根据Robert Lafore在C ++中的面向对象编程,静态和全局variables都存储在堆中
- 静态variables——-> 堆
- 常量数据types—–>代码
- 局部variables(在函数中声明和定义)——–>栈
- variables在主函数—–>堆中声明和定义
- 指针(例如,
char *arr
,int *arr
)——->堆 - dynamic分配空间(使用malloc和calloc)——–>堆栈
我只是从C的angular度来看这些variables。
如果我错了,请纠正我,因为我是新来的C.
你有一些这样的权利,但是谁写的问题至less欺骗了你一个问题:
- 全局variables——->数据(正确)
- 静态variables——->数据(正确)
- 常数数据types—–>代码和/或数据。 当一个常量本身存储在数据段中时,请考虑string文字,并将其引用embedded到代码中
- 局部variables(在函数中声明和定义)——–>堆栈(正确)
- 在
main
函数中声明和定义的variables—–>堆也堆栈(老师试图欺骗你) - 指针(例如:
char *arr
,int *arr
)——->堆数据或堆栈,取决于上下文。 C可以让你声明一个全局或static
指针,在这种情况下指针本身最终会在数据段中。 - dynamic分配空间(使用
malloc
,calloc
,realloc
)——–>栈堆
值得一提的是,“堆栈”被正式称为“自动存储类”。
对于那些有兴趣了解这些内存段的未来访问者,我正在写关于C:
有些人抬头:
- 每当一个C程序被执行时,一些内存被分配到RAM中供程序执行。 该存储器用于存储经常执行的代码(二进制数据),程序variables等。下面的存储器段说明了相同的情况:
- 通常有三种types的variables:
- 局部variables(在C中也称为自动variables)
- 全局variables
- 静态variables
- 你可以有全局的静态或局部静态variables,但上面的三个是父types。
5个内存段在C:
1.代码段
- 代码段,也被称为文本段,是包含频繁执行代码的内存区域。
- 代码段通常是只读的,以避免编程像缓冲区溢出等错误而被重写的风险。
- 代码段不包含程序variables,如本地variables( 也称为C中的自动variables ),全局variables等。
- 基于C实现,代码段也可以包含只读string文字。 例如,当你做
printf("Hello, world")
string“Hello,world”被创build在代码/文本段中。 您可以在Linux操作系统中使用size
命令来validation。 - 进一步阅读
数据段
数据段分为以下两部分,通常位于堆区之下,或者位于堆栈之上的某些实现中,但是数据段永远不会位于堆栈和堆栈区之间。
2.未初始化的数据段
- 这部分也被称为bss 。
- 这是内存的一部分,其中包含:
- 未初始化的全局variables (包括指针variables)
- 未初始化的常量全局variables 。
- 未初始化的本地静态variables 。
- 未初始化的全局或静态局部variables将被存储在未初始化的数据段中
- 例如:全局variables
int globalVar;
或静态局部variablesstatic int localStatic;
将被存储在未初始化的数据段中。 - 如果声明一个全局variables并将其初始化为
0
或NULL
那么它仍然会转到未初始化的数据段或bss。 - 进一步阅读
3.初始化的数据段
- 此细分商店存储:
- 初始化的全局variables (包括指针variables)
- 初始化常量全局variables 。
- 初始化本地静态variables 。
- 例如:全局variables
int globalVar = 1;
或静态局部variablesstatic int localStatic = 1;
将被存储在初始化的数据段中。 - 该段可以进一步分为初始化只读区和初始化读写区 。 初始化的常量全局variables将进入初始化的只读区域,而其值可在运行时修改的variables将进入初始化的读写区域 。
- 该段的大小由程序源代码中的值的大小决定,并且在运行时不会改变 。
- 进一步阅读
4.堆栈段
- 堆栈段用于存储在函数内部创build的variables( 函数可以是主函数或用户定义的函数 ),variables类似
- 函数的局部variables (包括指针variables)
- 传递给函数的参数
- 退货地址
- 一旦函数执行结束,存储在堆栈中的variables将被删除。
- 进一步阅读
5.堆段
- 这部分是为了支持dynamic内存分配。 如果程序员想要dynamic地分配一些内存,那么使用
malloc
,calloc
或realloc
方法来完成。 - 例如,当
int* prt = malloc(sizeof(int) * 2)
将在堆中分配八个字节,该位置的内存地址将被返回并存储在ptr
variables中。ptr
variables将根据声明/使用的方式位于堆栈或数据段上。 - 进一步阅读
纠正了你错误的句子
constant data types -----> code //wrong
局部常量variables—–>堆栈
初始化全局常量variables—–>数据段
未初始化的全局常量variables—–> bss
variables declared and defined in main function -----> heap //wrong
在主函数—–>堆栈中声明和定义的variables
pointers(ex:char *arr,int *arr) -------> heap //wrong dynamically allocated space(using malloc,calloc) --------> stack //wrong
指针(例如:char * arr,int * arr)——->指针variables的大小将在堆栈中。
考虑你dynamic分配n字节的内存(使用malloc
或calloc
),然后使指针variables指向它。 现在n
个字节的内存在堆中,并且指针variables需要4个字节(如果64个字的机器是8个字节),它们将堆栈以存储内存块的n
个字节的起始指针。
注:指针variables可以指向任何段的内存。
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 ... }
dynamic分配空间(使用malloc,calloc)——–>堆
stream行的桌面体系结构将stream程的虚拟内存分为几个部分 :
-
文本段:包含可执行代码。 指令指针取值在这个范围内。
-
数据段:包含全局variables(即具有静态链接的对象)。 细分为只读数据(如string常量)和未初始化数据(“BSS”)。
-
堆栈段:包含程序的dynamic内存,即所有线程的空闲存储(“heap”)和本地堆栈帧。 传统上,C堆栈和C堆堆栈是用来从两端扩展到堆栈段的,但是我相信实践已经被放弃了,因为它太不安全了。
AC程序通常会将具有静态存储持续时间的对象放入数据段中,在自由存储中dynamic分配对象,并在其所在线程的调用堆栈上自动执行对象。
在其他平台上,比如旧x86实模式或embedded式设备上,事情显然可能会有根本的不同。
我只是从C的angular度来看这些variables。
从C语言的angular度来讲,重要的是程度,范围,联系和访问; 到底如何将项目映射到不同的内存段取决于具体的实现,而且会有所不同。 语言标准根本不谈论内存段。 大多数现代build筑的行为方式基本相同。 块范围variables和函数参数将从堆栈中分配,文件范围和静态variables将从数据或代码段中分配,dynamic内存将从堆中分配,一些常量数据将存储在只读段中等等
指针(例如:char * arr,int * arr)——->堆
不,他们可以在堆栈中或数据段中。 他们可以指向任何地方
- variables/自动variables—>堆栈部分
- dynamic分配variables—>堆部分
- 初始化全局variables – >数据部分
- 未初始化的全局variables – >数据段(bss)
- 静态variables – >数据部分
- string常量 – >文本部分/代码部分
- 函数 – >文本部分/代码部分
- 文本代码 – >文本部分/代码部分
- 寄存器 – > CPU寄存器
- 命令行input – >环境/命令行部分
- 环境variables – >环境/命令行部分