我的变量存储在C语言的内存中的什么地方?
考虑到内存分为四个部分:数据、堆、堆栈和代码,全局变量、静态变量、常量数据类型、局部变量(在函数中定义和声明)、变量(在主函数中)、指针和动态分配的空间(使用malloc和calloc)存储在内存中的什么位置 我认为它们的分配如下:我的变量存储在C语言的内存中的什么地方?,c,memory,memory-management,types,C,Memory,Memory Management,Types,考虑到内存分为四个部分:数据、堆、堆栈和代码,全局变量、静态变量、常量数据类型、局部变量(在函数中定义和声明)、变量(在主函数中)、指针和动态分配的空间(使用malloc和calloc)存储在内存中的什么位置 我认为它们的分配如下: 全局变量------->数据 静态变量------->数据 常量数据类型------>代码 局部变量(在函数中声明和定义)--->stack 在主函数------>heap中声明和定义的变量 指针(例如,char*arr,int*arr)堆 动态分配的空间(使用m
- 全局变量------->数据
- 静态变量------->数据
- 常量数据类型------>代码
- 局部变量(在函数中声明和定义)--->stack
- 在主函数------>heap中声明和定义的变量
- 指针(例如,
,char*arr
)堆int*arr
- 动态分配的空间(使用malloc和calloc)--->stack
不,它们可以在堆栈上或数据段中。他们可以指向任何地方 有些问题你是对的,但写这些问题的人至少在一个问题上欺骗了你:
- 全局变量------->数据(正确)
- 静态变量------->数据(正确)
- 常量数据类型------>代码和/或数据。考虑当常量本身将存储在数据段中的情况下的字符串文字,并将其引用嵌入到代码 中。
- 局部变量(在函数中声明和定义)--->堆栈(正确)
- 在
function----->heap中声明和定义的变量也是堆栈(老师想欺骗你)main
- 指针(例如:
,char*arr
)------>堆数据或堆栈,具体取决于上下文。C允许您声明一个全局或int*arr
指针,在这种情况下,指针本身将在数据段中结束静态
- 动态分配的空间(使用
,malloc
,calloc
)堆栈堆realloc
值得一提的是,“stack”被正式称为“automatic storage class”。有些问题你说对了,但写这些问题的人至少在一个问题上欺骗了你:
- 全局变量------->数据(正确)
- 静态变量------->数据(正确)
- 常量数据类型------>代码和/或数据。考虑当常量本身将存储在数据段中的情况下的字符串文字,并将其引用嵌入到代码 中。
- 局部变量(在函数中声明和定义)--->堆栈(正确)
- 在
function----->heap中声明和定义的变量也是堆栈(老师想欺骗你)main
- 指针(例如:
,char*arr
)------>堆数据或堆栈,具体取决于上下文。C允许您声明一个全局或int*arr
指针,在这种情况下,指针本身将在数据段中结束静态
- 动态分配的空间(使用
,malloc
,calloc
)堆栈堆realloc
值得一提的是,“堆栈”正式称为“自动存储类”。纠正了您的错误句子
constant data types -----> code //wrong
局部常量变量------>堆栈
初始化的全局常量变量------>数据段
未初始化的全局常量变量------>bss
在主函数------>stack中声明和定义的变量
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)--->heap纠正了错误的句子
constant data types -----> code //wrong
局部常量变量------>堆栈
初始化的全局常量变量------>数据段
未初始化的全局常量变量------>bss
在主函数------>stack中声明和定义的变量
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)--->heap一种流行的桌面体系结构将进程的虚拟内存划分为几个部分:
- 文本段:包含可执行代码。指令指针接受此范围内的值
- 数据段:包含全局变量(即具有静态链接的对象)。细分为只读数据(如字符串常量)和未初始化数据(“BSS”)
- 堆栈段:包含程序的动态内存,即所有线程的空闲存储(“堆”)和本地堆栈帧。传统上,C堆栈和C堆通常从相反的一端扩展到堆栈段,但我相信这种做法已经被b放弃了
void f(void) { /* RODATA / TEXT */ char *a = "abc"; /* Stack. */ char b[] = "abc"; char c[] = {'a', 'b', 'c', '\0'}; }
void f(int i, int j);
int *i = malloc(sizeof(int));