我的变量存储在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 实模式或嵌入式设备上,情况显然会完全不同。

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

(890)
DllNotFoundException:LogitechSteeringWheelEnginesWrapper.dll
上一篇
用另一种颜色替换图像中的特定颜色(exchange iphone for different color)
下一篇

相关推荐

  • vscode code命令:# 如何使用 VSCode 命令

    VSCode Code命令是Visual Studio Code的一个内置命令,用于在本地和远程服务器上执行代码。它可以让你在不同的系统上运行代码,而不需要安装任何软件。…

    2023-01-22 09:55:35
    0 51 12
  • cv糖醋排骨是弯的吗弯曲的美味

    cv糖醋排骨不是弯的,它是一种制作方法,通常用来制作排骨。代码:…

    2023-01-30 08:19:31
    0 45 30
  • cv树洞柒夜事件CV树洞中的秘密与惊奇

    cv树洞柒夜事件是一个有趣的计算机视觉活动,它提供了一种新的方式来利用计算机视觉技术来探索和发现景观。它始于2020年7月,由一群热爱计算机视觉的研究者和开发者发起,他们希望通过使用机器学习技术来探索景观中的精彩之处。cv树洞柒夜事件的目标是使用机器学习技术来探索景观中的精彩之处,并利用这些发现来改善景观设计。参与者需要使用机器学习技术来探索景观,并利用这些发现来改善景观设计。参与者可以使用Python,OpenCV,TensorFlow等技术来完成任务,并将其发布在GitHub上。…

    2023-01-08 12:49:50
    0 84 53
  • cv小随:如何利用CV技术提升求职成功率

    示例示例cv小随是一种基于计算机视觉的智能技术,它可以帮助用户自动识别图像中的物体、场景和行为,从而实现自动化的图像处理。cv小随可以用于多种应用场景,如图像搜索、图像分类、图像识别、图像检测等。…

    2023-01-01 11:12:42
    0 18 76
  • win10可以安装cad2007吗:CAD2007是否可以在Win10上安装?

    不可以,因为CAD2007不支持Windows 10系统。如果想要安装CAD2007,需要安装在Windows XP或者Windows 7系统上。…

    2023-01-20 02:04:42
    0 97 98
  • iban code是什么意思一种国际银行帐户号码标准

    IBAN(International Bank Account Number)代码是一种国际标准的银行账户号码,用于在不同国家之间进行国际转账。它由一串字母和数字组成,通常由2至4个字母开头,后面跟着一串数字。…

    2022-12-30 09:24:47
    0 36 45
  • cv 机器视觉:如何利用机器视觉技术提高图像处理效率

    CV(Computer Vision)机器视觉是一门研究计算机如何理解和处理图像的学科,它旨在使计算机能够以人类般的方式识别和理解图像。它主要应用于图像处理、图像分析、计算机视觉等领域,广泛应用于机器人、自动驾驶、医疗影像分析等领域。…

    2023-01-23 11:32:51
    0 10 62
  • mac 开发c++:Mac 下开发 C++ 的入门指南

    示例示例Mac OS X 是一个强大的操作系统,可以用来开发 C++ 应用程序。下面是一个简单的 C++ 程序的代码示例:#include…

    2023-01-02 10:39:58
    0 70 84

发表评论

登录 后才能评论

评论列表(76条)