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

通过考虑内存分为四个部分:数据,堆,堆栈和代码,全局variables,静态variables,常量数据types,局部variables(在函数中定义和声明),variables(在主函数中),指针,并dynamic分配空间(使用malloc和calloc)获取存储在内存中?

我认为他们将被分配如下:

  • 全局variables——-> (根据Robert Lafore在C ++中的面向对象编程,静态和全局variables都存储在堆中
  • 静态variables——->
  • 常量数据types—–>代码
  • 局部variables(在函数中声明和定义)——–>栈
  • variables在主函数—–>堆中声明和定义
  • 指针(例如, char *arrint *arr )——->堆
  • dynamic分配空间(使用malloc和calloc)——–>堆栈

我只是从C的angular度来看这些variables。

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

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

  • 全局variables——->数据(正确)
  • 静态variables——->数据(正确)
  • 常数数据types—–>代码和/或数据。 当一个常量本身存储在数据段中时,请考虑string文字,并将其引用embedded到代码中
  • 局部variables(在函数中声明和定义)——–>堆栈(正确)
  • main函数中声明和定义的variables—–> 也堆栈(老师试图欺骗你)
  • 指针(例如: char *arrint *arr )——-> 数据或堆栈,取决于上下文。 C可以让你声明一个全局或static指针,在这种情况下指针本身最终会在数据段中。
  • dynamic分配空间(使用malloccallocrealloc )——–>

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

对于那些有兴趣了解这些内存段的未来访问者,我正在写关于C:

有些人抬头:

  1. 每当一个C程序被执行时,一些内存被分配到RAM中供程序执行。 该存储器用于存储经常执行的代码(二进制数据),程序variables等。下面的存储器段说明了相同的情况:
  2. 通常有三种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
  • 这是内存的一部分,其中包含:
    1. 未初始化的全局variables (包括指针variables)
    2. 未初始化的常量全局variables
    3. 未初始化的本地静态variables
  • 未初始化的全局或静态局部variables将被存储在未初始化的数据段中
  • 例如:全局variablesint globalVar; 或静态局部variablesstatic int localStatic; 将被存储在未初始化的数据段中。
  • 如果声明一个全局variables并将其初始化为0NULL那么它仍然会转到未初始化的数据段或bss。
  • 进一步阅读

3.初始化的数据段

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

4.堆栈段

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

5.堆段

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

纠正了你错误的句子

 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字节的内存(使用malloccalloc ),然后使指针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 – >环境/命令行部分