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

sta*_*k92 134 c memory types memory-management

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

我认为他们将分配如下:

  • 全局变量------->数据
  • 静态变量------->数据
  • 常量数据类型----->代码
  • 局部变量(在函数中声明和定义)--------> stack
  • 在main函数-----> heap中声明和定义的变量
  • 指针(例如char *arr,int *arr)------->堆
  • 动态分配空间(使用malloc和calloc)-------->堆栈

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

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

das*_*ght 190

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

  • 全局变量------->数据(正确)
  • 静态变量------->数据(正确)
  • 常量数据类型----->代码和/或数据.当一个常量本身存储在数据段中时,考虑字符串文字,并且对它的引用将嵌入到代码中
  • 局部变量(在函数中声明和定义)--------> stack(正确)
  • main函数中声明和定义的变量-----> 也堆栈(老师试图欺骗你)
  • 指针(例如:char *arr,int *arr)-------> 数据或堆栈,具体取决于上下文.C允许您声明全局或static指针,在这种情况下,指针本身将在数据段中结束.
  • 动态分配的空间(使用malloc,calloc,realloc)--------> 的堆

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

  • 还值得一提的是,堆正式根本没有被调用.分配的内存来自某个地方,标准中没有"某处"的名称. (5认同)
  • 在某些系统上,(即Linux和*BSD)还有`alloca`,其工作方式类似于`malloc`,但是堆栈分配. (5认同)

hag*_*wal 105

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

一些人抬头:

  1. 每当执行C程序时,在RAM中分配一些存储器用于程序执行.该存储器用于存储频繁执行的代码(二进制数据),程序变量等.以下内存段说明相同:
  2. 通常有三种类型的变量:
    • 局部变量(在C中也称为自动变量)
    • 全局变量
    • 静态变量
    • 您可以拥有全局静态或本地静态变量,但以上三个是父类型.

5 C中的内存段:

1.代码段

  • 代码段(也称为文本段)是包含频繁执行的代码的存储器区域.
  • 代码段通常是只读的,以避免因缓冲区溢出等编程错误而被覆盖的风险.
  • 代码段不包含程序变量,如局部变量(在C中也称为自动变量),全局变量等.
  • 基于C实现,代码段还可以包含只读字符串文字.例如,当您执行此操作时printf("Hello, world"),将在代码/文本段中创建字符串"Hello,world".您可以size在Linux OS中使用命令验证这一点.
  • 进一步阅读

数据段

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

2.未初始化的数据段

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

3.初始化数据段

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

4.堆栈段

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

5.堆段

  • 此段用于支持动态内存分配.如果程序员想要分配一些内存动态然后在C中,它是使用完成malloc,callocrealloc方法.
  • 例如,当int* prt = malloc(sizeof(int) * 2)将在堆中分配八个字节时,将返回该位置的内存地址并将其存储在ptr变量中.该ptr变量将是取决于它被声明/使用方式任一堆栈或数据段.
  • 进一步阅读


ras*_*hok 8

纠正了错误的句子

constant data types ----->  code //wrong
Run Code Online (Sandbox Code Playgroud)

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

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

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

variables declared and defined in main function  ----->  heap //wrong
Run Code Online (Sandbox Code Playgroud)

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

pointers(ex:char *arr,int *arr) ------->  heap //wrong

dynamically allocated space(using malloc,calloc) --------> stack //wrong
Run Code Online (Sandbox Code Playgroud)

指针(例如: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
...
}
Run Code Online (Sandbox Code Playgroud)

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


Ker*_* SB 6

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

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

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

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

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

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


Joh*_*ode 5

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

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


归档时间:

查看次数:

195293 次

最近记录:

6 年,11 月 前