我的变量存储在C中的内存在哪里

考虑到内存分为四段:数据,堆,堆栈和代码,在哪里做全局变量,静态变量,常量数据类型,局部变量(定义和声明的功能),变量(在主函数),指针和动态分配的空间(使用 malloc 和 calloc)存储在内存中?

考虑到内存分为四段:数据,堆,堆栈和代码,在哪里做全局变量,静态变量,常量数据类型,局部变量(定义和声明的功能),变量(在主函数),指针和动态分配的空间(使用 malloc 和 calloc)存储在内存中?

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

全局变量-------& gt;数据

静态变量-------& gt;数据

常量数据类型-----& gt;代码

局部变量(在函数中声明和定义)--------& gt;堆栈

在主函数中声明和定义的变量-----& gt;堆

指针(例如,char *arrint *arr)-------& gt;堆

动态分配的空间(使用 malloc 和 calloc)--------& gt;堆栈

我只是从 C 的角度来看这些变量。

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

279

你有一些权利,但不管是谁写的问题欺骗了你至少一个问题:

全局变量-------& gt;数据(正确)

静态变量-------& gt;数据(正确)

常量数据类型----->代码和/或数据。对于常量本身将存储在数据段中,并且对它的引用将嵌入到代码中的情况,请考虑字符串文字

局部变量(在函数中声明和定义)--------& gt;堆栈(正确)

main函数中声明和定义的变量-----也堆栈(老师试图欺骗你)

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

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

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

168

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

有些人抬起头来:

每当执行 C 程序时,都会在 RAM 中为程序执行分配一些内存。该内存用于存储频繁执行的代码(二进制数据),程序变量等。以下内存段讨论相同:

通常有三种类型的变量:

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

全局变量

静态变量

您可以有全局静态或局部静态变量,但上述三个是父类型。

C 中的 5 个内存段:

1.代码段

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

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

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

基于 C 实现,代码段也可以包含只读字符串。例如,当您执行printf("Hello, world")时,会在代码 / 文本段中创建字符串“Hello,world”。您可以在 Linux 操作系统中使用size命令进行验证。

Further reading

数据段

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

2.未初始化的数据段

这个段也称为bss

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

未初始化的全局变量(包括指针变量)

未初始化的常量全局变量

未初始化的本地静态变量

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

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

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

Further reading

3.初始化数据段

此细分市场存储:

初始化全局变量(包括指针变量)

初始化常量全局变量

初始化的本地静态变量

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

此段可以进一步分为初始化只读区域和初始化读写区域初始化常量全局变量将进入初始化只读区域,而其值可在运行时修改的变量将进入初始化读写区域

此段的大小由程序源代码中的值的大小决定,并且在运行时不会更改

Further reading

4.堆栈段

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

函数的局部变量(包括指针变量)

传递给函数的参数

返回地址

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

Further reading

5.堆段

这个段支持动态内存分配,如果程序员想要动态地分配一些内存,那么在 C 中,它是使用malloccallocrealloc方法来完成的。

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

Further reading
13

纠正你的错误句子

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

局部常量变量-----& gt;堆栈

初始化全局常量变量-----& gt;数据段

未初始化的全局常量变量-----& gt;bss

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

在主函数中声明和定义的变量--& gt;堆栈

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)--------& gt;堆

9

流行的桌面体系结构将进程的虚拟内存分为几个

文本段:包含可执行代码。指令指针接受此范围内的值。

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

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

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

在其他平台上,例如旧的 x86 实模式或嵌入式设备上,情况显然会完全不同。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(371)
将音频同步到图片旋转木马(how to put a picture over audio)
上一篇
大写连字符名称(capitalize hyphenated words)
下一篇

相关推荐

  • cvt和自动挡哪个好提升驾驶体验的最佳选择

    CVT(可变转换器)是一种由传动带及传动轮组成的无级变速器,它可以在没有传动档位的情况下,根据驾驶者的驾驶习惯,自动调整传动轮之间的转速比,从而实现无级变速。自动挡是指车辆自动变速箱,它使用液力传动来实现变速,可以自动适应车辆的行驶状态,减少司机的疲劳,提高行车的舒适性。…

    2023-06-08 07:42:19
    0 78 23
  • cv一叶扁舟和清影轩阳:漫游在一叶扁舟和清影轩阳之间

    cv一叶扁舟是一款开源的计算机视觉库,用于图像处理、计算机视觉等。它提供了丰富的API,可以帮助开发者快速实现各种图像处理任务,如图像分割、目标检测、图像识别等。清影轩阳是一款开源的计算机视觉框架,用于图像处理、目标检测、分类等。它提供了丰富的API,可以帮助开发者快速实现各种图像处理任务,如图像分割、目标检测、图像识别等。…

    2023-08-05 07:06:20
    0 63 57
  • css设置滚动条宽度设置:This is a title

    CSS设置滚动条宽度的方法:使用CSS3的。-webkit-属性:…

    2023-06-06 10:53:01
    0 87 23
  • xl和xe汽车cvt:探索XL和XE汽车的CVT技术优势

    XL和XE汽车CVT是一种变速器,它使用液力变矩器代替传统的机械变速器,以达到更高的效率。它的工作原理是,当发动机输出功率时,液力变矩器就会将这些功率转换为液压能量,然后将能量传递到变速器的输出轴上,从而实现变速。…

    2023-04-09 00:41:04
    0 33 69
  • cordon bleu是什么意思:法式炸鸡卷——Cordon Bleu的经典之作

    Cordon Bleu是一种烹饪技术,其中肉片被置于奶酪和火腿之间,然后用面包屑裹上,最后煎炸或烤熟。这种技术通常用于制作鸡肉,但也可以用于制作其他类型的肉类,如牛肉或猪肉。…

    2024-01-27 15:13:30
    0 93 57
  • countif 非空:非空单元格的计数

    Countif 非空是指计算某个单元格不为空的数量。代码如下:…

    2023-04-22 15:54:15
    0 83 64
  • java double保留一位小数:How to Round a Double to One Decimal Place in

    示例示例使用类可以轻松实现java double保留一位小数的功能,具体代码如下:// 创建对象…

    2023-05-14 07:40:03
    0 47 89
  • linux如何写c语言一个完整的指南

    示例示例在Linux系统中,可以使用C语言编写源代码文件,然后使用GCC编译器来编译源代码文件,生成可执行文件。下面是一个简单的C语言代码示例:…

    2023-05-16 02:02:45
    0 55 48

发表评论

登录 后才能评论

评论列表(40条)