考虑到内存分为四段:数据,堆,堆栈和代码,在哪里做全局变量,静态变量,常量数据类型,局部变量(定义和声明的功能),变量(在主函数),指针和动态分配的空间(使用 malloc 和 calloc)存储在内存中?
我认为他们将被分配如下:
全局变量-------& gt;数据
静态变量-------& gt;数据
常量数据类型-----& gt;代码
局部变量(在函数中声明和定义)--------& gt;堆栈
在主函数中声明和定义的变量-----& gt;堆
指针(例如,char *arr
,int *arr
)-------& gt;堆
动态分配的空间(使用 malloc 和 calloc)--------& gt;堆栈
我只是从 C 的角度来看这些变量。
请纠正我,如果我错了,因为我是新的 C.
你有一些权利,但不管是谁写的问题欺骗了你至少一个问题:
全局变量-------& gt;数据(正确)
静态变量-------& gt;数据(正确)
常量数据类型----->;代码和/或数据。对于常量本身将存储在数据段中,并且对它的引用将嵌入到代码中的情况,请考虑字符串文字
局部变量(在函数中声明和定义)--------& gt;堆栈(正确)
在main
函数中声明和定义的变量-----堆也堆栈(老师试图欺骗你)
指针(例如:char *arr
,int *arr
)-------堆数据或堆栈,具体取决于上下文。C 允许您声明全局或static
指针,在这种情况下,指针本身将在数据段中结束。
动态分配的空间(使用malloc
,calloc
,realloc
)--------堆栈堆
值得一提的是,“堆栈”被正式称为“自动存储类”。

对于那些可能有兴趣了解这些内存段的未来访问者,我正在写关于 C 中 5 个内存段的要点:
有些人抬起头来:
每当执行 C 程序时,都会在 RAM 中为程序执行分配一些内存。该内存用于存储频繁执行的代码(二进制数据),程序变量等。以下内存段讨论相同:
通常有三种类型的变量:
局部变量(在 C 中也称为自动变量)
全局变量
静态变量
您可以有全局静态或局部静态变量,但上述三个是父类型。
C 中的 5 个内存段:
1.代码段
代码段,也称为文本段,是包含频繁执行的代码的内存区域。
代码段通常是只读的,以避免被缓冲区溢出等编程错误覆盖的风险。
代码段不包含程序变量,如局部变量(在 C中也称为自动变量),全局变量等。
基于 C 实现,代码段也可以包含只读字符串。例如,当您执行printf("Hello, world")
时,会在代码 / 文本段中创建字符串“Hello,world”。您可以在 Linux 操作系统中使用size
命令进行验证。
数据段
数据段分为以下两部分,通常位于堆区域下方,或者在某些实现中位于堆栈上方,但数据段从不位于堆和堆栈区域之间。
2.未初始化的数据段
这个段也称为bss。
这是内存的一部分,其中包含:
未初始化的全局变量(包括指针变量)
未初始化的常量全局变量。
未初始化的本地静态变量。
任何未初始化的全局或静态局部变量将存储在未初始化的数据段中
例如:全局变量int globalVar;
或静态局部变量static int localStatic;
将存储在未初始化的数据段中。
如果您声明一个全局变量并将其初始化为0
或NULL
,那么它仍然会转到未初始化的数据段或 bss。
3.初始化数据段
此细分市场存储:
初始化全局变量(包括指针变量)
初始化常量全局变量。
初始化的本地静态变量。
例如:全局变量int globalVar = 1;
或静态局部变量static int localStatic = 1;
将存储在初始化数据段中。
此段可以进一步分为初始化只读区域和初始化读写区域。初始化常量全局变量将进入初始化只读区域,而其值可在运行时修改的变量将进入初始化读写区域。
此段的大小由程序源代码中的值的大小决定,并且在运行时不会更改。
Further reading4.堆栈段
堆栈段用于存储在函数内部创建的变量(函数可以是主函数或用户定义的函数),变量如
函数的局部变量(包括指针变量)
传递给函数的参数
返回地址
函数执行完成后,存储在堆栈中的变量将被删除。
Further reading5.堆段
这个段支持动态内存分配,如果程序员想要动态地分配一些内存,那么在 C 中,它是使用malloc
、calloc
或realloc
方法来完成的。
例如,当int* prt = malloc(sizeof(int) * 2)
时,将在堆中分配八个字节,并返回该位置的内存地址并存储在ptr
变量中。ptr
变量将位于堆栈或数据段上,具体取决于声明 / 使用的方式。
纠正你的错误句子
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 个字节的内存(使用malloc
或calloc
),然后使指针变量指向它。现在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;堆
流行的桌面体系结构将进程的虚拟内存分为几个段:
文本段:包含可执行代码。指令指针接受此范围内的值。
数据段:包含全局变量(即具有静态链接的对象)。细分为只读数据(例如字符串常量)和未初始化数据(“BSS”)。
堆栈段:包含程序的动态内存,即所有线程的空闲存储(“堆”)和本地堆栈帧。传统上,C 堆栈和 C 堆用于从两端增长到堆栈段,但我相信这种做法已经被放弃,因为它太不安全了。
C 程序通常将具有静态存储持续时间的对象放入数据段中,将动态分配的对象放在空闲存储上,并将自动对象放在其所在线程的调用堆栈上。
在其他平台上,例如旧的 x86 实模式或嵌入式设备上,情况显然会完全不同。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(66条)