内存中的位置是我的变量存储在C中?
通过考虑内存分为四个部分:数据,堆,堆栈和代码,全局变量,静态变量,常量数据类型,局部变量(在函数中定义和声明),变量(在主函数中),指针,并动态分配空间(使用malloc和calloc)获取存储在内存中?
我认为他们将被分配如下:
char *arr
, int *arr
)------->堆 我只是从C的角度来看这些变量。
如果我错了,请纠正我,因为我是新手C.
你有这些权利,但是谁写这些问题至少欺骗了你一个问题:
main
函数中声明和定义的变量----->堆也堆栈(老师试图欺骗你) char *arr
, int *arr
)------->堆数据或堆栈,取决于上下文。 C可以让你声明一个全局或static
指针,在这种情况下,指针本身最终会在数据段中出现。 malloc
, calloc
, realloc
)-------->栈堆 值得一提的是,“堆栈”被正式称为“自动存储类”。
对于那些有兴趣了解这些内存段的未来访问者,我写了关于C中5个内存段的重要观点:
有些人抬起头来:
5个内存段C:
1.代码段
printf("Hello, world")
字符串“Hello,world”会在代码/文本段中创建。 您可以在Linux操作系统中使用size
命令验证这一点。 数据段
数据段分为以下两部分,通常位于堆区之下,或者位于堆栈之上的某些实现中,但数据段永远不会位于堆栈和堆栈区之间。
2.未初始化的数据段
int globalVar;
或静态局部变量static int localStatic;
将被存储在未初始化的数据段中。 0
或NULL
那么它仍然会转到未初始化的数据段或bss。 3.初始化的数据段
int globalVar = 1;
或静态局部变量static int localStatic = 1;
将存储在已初始化的数据段中。 4.堆栈段
5.堆段
malloc
, calloc
或realloc
方法完成。 int* prt = malloc(sizeof(int) * 2)
将在堆中分配八个字节,并且该位置的内存地址将被返回并存储在ptr
变量中。 根据声明/使用的方式, ptr
变量将位于堆栈或数据段中。 更正了你错误的句子
constant data types -----> code //wrong
局部常量变量----->堆栈
初始化全局常量变量----->数据段
未初始化的全局常量变量-----> bss
variables declared and defined in main function -----> heap //wrong
在主函数----->堆栈中声明和定义的变量
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)-------->堆
链接地址: http://www.djcxy.com/p/28341.html