C语言中的内存模型(栈区,堆区等的分别)

众所周知代码是储存在内存中的,那么C语言的代码是全部储存在一起的还是分开存储的呢,它们储存的地方到底在哪呢?
今天我们就来一探究竟。
C语言中的内存模型(栈区,堆区等的分别)_第1张图片
上图就是C语言代码的具体储存位置,接下来我将一一介绍。
代码区:存放函数体的二进制代码。
常量区:存放一般的常量、字符串常量等。这块内存只有读取权限,没有写入权限,因此它们的值在程序运行期间不能改变。(这点尤其重要,一定要牢记)
静态区(全局区):存放全局变量、静态变量等。这块内存有读写权限,因此它们的值在程序运行期间可以任意改变。(这里有个小细节值得我们注意一下,所有的全局变量在未初始化时都会默认被赋值为0,而当我们定义全局变量时,已初始化的变量和未初始化的变量实际上是分别储存在不同位置的,系统会将储存在未初始化的变量区的变量统一赋值为0后,再与已初始化的变量放在一起存放。)
堆区:一般由程序员分配和释放,若程序员不释放,程序运行结束时由操作系统回收。malloc()、calloc()、free() 等函数操作的就是这块内存。
栈区:存放函数的参数值、局部变量的值等。

接下来我给出一段代码,请大家判断代码中的各部分都是储存在哪里的。

#include 
char *str1 = "hello world"; 
int n;
char* func(){
     
    char *str = "hello world";
    return str;
}
int main(){
     
    int a;
    static int b; 
    const int c;
    char *str2 = "01234";
    char  arr[20] = "56789";
}

答案:

#include 
char *str1 = "hello world"; //字符串在常量区,str1在全局数据区
int n;  //全局数据区
char* func(){
     
    char *str = "hello world";  //字符串在常量区,str在栈区
    return str;
}
int main(){
     
    int a;  //栈区
    static int b;//静态区 
    const int b;//常量
    char *str2 = "01234";  //字符串在常量区,str2在栈区
    char  arr[20] = "56789";  //字符串在常量区和栈区,arr在栈区
}

这里值得我们留意一下:

char *str2 = "01234";  //字符串在常量区,str2在栈区
char  arr[20] = "56789";  //字符串在常量区和栈区,arr在栈区

实际上“01234”和“56789”都是储存在常量区的,而第一种实际上是用指针指向了常量区中存放“01234”的位置上,所以你是不可以使用这样的语句的:*str2=‘6’的(因为你试图改变常量区中的东西);而第二种则是在栈区开辟了一个新的储存空间,然后将常量区的“56789”复制一份放在栈区中,因此你是可以使用这样的语句的:arr[0]=‘0’,但是这样做并不会改变常量区中的“56789”。

你可能感兴趣的:(C语言中的内存模型(栈区,堆区等的分别))