sta*_*k92 134 c memory types memory-management
通过考虑将内存分为四个部分:数据,堆,堆栈和代码,全局变量,静态变量,常量数据类型,局部变量(在函数中定义和声明),变量(在main函数中),指针,并动态分配空间(使用malloc和calloc)存储在内存中?
我认为他们将分配如下:
char *arr,int *arr)------->堆我只是从C的角度来指这些变量.
如果我错了,请纠正我,因为我是C的新手.
das*_*ght 190
你有其中一些是正确的,但是写这些问题的人至少会欺骗你一个问题:
main函数中声明和定义的变量-----> char *arr,int *arr)-------> static指针,在这种情况下,指针本身将在数据段中结束.malloc,calloc,realloc)--------> 值得一提的是,"堆栈"被正式称为"自动存储类".
hag*_*wal 105
对于那些可能有兴趣了解这些内存段的未来访问者,我在C中写了5个内存段的重点:
一些人抬头:
5 C中的内存段:
printf("Hello, world"),将在代码/文本段中创建字符串"Hello,world".您可以size在Linux OS中使用命令验证这一点.数据段分为以下两部分,通常位于堆区域下方或堆栈上方的某些实现中,但数据段永远不在堆和堆栈区域之间.
int globalVar;或静态局部变量static int localStatic;将存储在未初始化的数据段中.0或者NULL仍然会转到未初始化的数据段或bss.int globalVar = 1;或静态局部变量static int localStatic = 1;将存储在初始化数据段中.malloc,calloc或realloc方法.int* prt = malloc(sizeof(int) * 2)将在堆中分配八个字节时,将返回该位置的内存地址并将其存储在ptr变量中.该ptr变量将是取决于它被声明/使用方式任一堆栈或数据段.纠正了错误的句子
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个字节的内存(使用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
...
}
Run Code Online (Sandbox Code Playgroud)
动态分配空间(使用malloc,calloc)-------->堆
流行的桌面架构将进程的虚拟内存分为几个部分:
文本段:包含可执行代码.指令指针采用此范围内的值.
数据段:包含全局变量(即具有静态链接的对象).细分为只读数据(如字符串常量)和未初始化数据("BSS").
堆栈段:包含程序的动态内存,即所有线程的空闲存储("堆")和本地堆栈帧.传统上C堆栈和C堆用于从相对的两端进入堆栈段,但我相信这种做法已被放弃,因为它太不安全了.
AC程序通常将具有静态存储持续时间的对象放入数据段,在自由存储上动态分配对象,并将自动对象放置在其所在的线程的调用堆栈中.
在其他平台上,例如旧的x86实模式或嵌入式设备上,事情显然可能完全不同.
我只是从C的角度来指这些变量.
从C语言的角度来看,重要的是范围,范围,联系和访问; 具体如何将项映射到不同的内存段取决于各个实现,这将有所不同.语言标准不谈论内存段可言.大多数现代建筑的行为大致相同; 块范围变量和函数参数将从堆栈中分配,文件范围和静态变量将从数据或代码段分配,动态内存将从堆中分配,一些常量数据将存储在只读段中等
| 归档时间: |
|
| 查看次数: |
195293 次 |
| 最近记录: |