我的变量存储在C语言的内存中的什么地方?

我的变量存储在C语言的内存中的什么地方?,c,memory,memory-management,types,C,Memory,Memory Management,Types,考虑到内存分为四个部分:数据、堆、堆栈和代码,全局变量、静态变量、常量数据类型、局部变量(在函数中定义和声明)、变量(在主函数中)、指针和动态分配的空间(使用malloc和calloc)存储在内存中的什么位置 我认为它们的分配如下: 全局变量------->数据 静态变量------->数据 常量数据类型------>代码 局部变量(在函数中声明和定义)--->stack 在主函数------>heap中声明和定义的变量 指针(例如,char*arr,int*arr)堆 动态分配的空间(使用m

考虑到内存分为四个部分:数据、堆、堆栈和代码,全局变量、静态变量、常量数据类型、局部变量(在函数中定义和声明)、变量(在主函数中)、指针和动态分配的空间(使用malloc和calloc)存储在内存中的什么位置

我认为它们的分配如下:

  • 全局变量------->数据
  • 静态变量------->数据
  • 常量数据类型------>代码
  • 局部变量(在函数中声明和定义)--->stack
  • 在主函数------>heap中声明和定义的变量
  • 指针(例如,
    char*arr
    int*arr
    )堆
  • 动态分配的空间(使用malloc和calloc)--->stack
我只是从C的角度来引用这些变量

如果我错了,请纠正我,因为我是C的新手

指针(例如:char*arr,int*arr)--->heap

不,它们可以在堆栈上或数据段中。他们可以指向任何地方

指针(例如:char*arr,int*arr)--->heap


不,它们可以在堆栈上或数据段中。他们可以指向任何地方

有些问题你是对的,但写这些问题的人至少在一个问题上欺骗了你:

  • 全局变量------->数据(正确)
  • 静态变量------->数据(正确)
  • 常量数据类型------>代码和/或数据。考虑当常量本身将存储在数据段中的情况下的字符串文字,并将其引用嵌入到代码
  • 中。
  • 局部变量(在函数中声明和定义)--->堆栈(正确)
  • main
    function----->heap中声明和定义的变量也是堆栈(老师想欺骗你)
  • 指针(例如:
    char*arr
    int*arr
    )------>堆数据或堆栈,具体取决于上下文。C允许您声明一个全局或
    静态
    指针,在这种情况下,指针本身将在数据段中结束
  • 动态分配的空间(使用
    malloc
    calloc
    realloc
    )堆栈堆

值得一提的是,“stack”被正式称为“automatic storage class”。

有些问题你说对了,但写这些问题的人至少在一个问题上欺骗了你:

  • 全局变量------->数据(正确)
  • 静态变量------->数据(正确)
  • 常量数据类型------>代码和/或数据。考虑当常量本身将存储在数据段中的情况下的字符串文字,并将其引用嵌入到代码
  • 中。
  • 局部变量(在函数中声明和定义)--->堆栈(正确)
  • main
    function----->heap中声明和定义的变量也是堆栈(老师想欺骗你)
  • 指针(例如:
    char*arr
    int*arr
    )------>堆数据或堆栈,具体取决于上下文。C允许您声明一个全局或
    静态
    指针,在这种情况下,指针本身将在数据段中结束
  • 动态分配的空间(使用
    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));