1.c语言中的内存区域
C语言程序在内存执行时主要分为四个区:代码区、静态区、栈区、堆区(还有更细的分法,此为常用的)
(1)代码区
存放:程序执行的代码、一些只读的常数变量(如字符串常量)
这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读 。
代码演示:
#include<stdio.h>
int main(void)
{
char str[] = "你好";
char *p_str = "http"; //顺便提一下,这句在g++编译器中无法通过,C++中字符串常量为const char[],不允许转换为char*
printf("%p, %p, %p\n", str, p_str, main);
str[0] = '1'; //str在栈区中,可读可写,在赋值过程中,将字符串常量复制了一份给到栈区中的str[],此处运行没有问题
printf("%s\n", str);
//*p_str = '1'; // 执行到这句程序崩溃,因为此时指针p_str指向的地址是字符串常量(存放在代码区),只读区域不能写
//printf("%s\n", p_str);
return 0;
}
运行结果:
从上述结果可以发现main函数和字符串常量在同一区域,其实都在代码区,并且代码区只读不可修改。
(2)静态区
存放:全局变量、静态变量
生命周期:从程序运行时开始,直到程序结束(在程序运行期间都占用内存)
静态区存储的内容在程序加载到内存的时候就确定
可读可写
代码演示:
#include <stdio.h>
int g_a = 0; // 全局变量
static int s_c = 0; // 全局静态变量
void test(void)
{
static int s_d = 0; // 局部静态变量
static int s_e = 0; // 局部静态变量
int i = 0; // 局部变量
printf("&s_d = %p, &s_e = %p, &i = %p\n", &s_d, &s_e, &i);
}
int main()
{
int i = 0;
// 打印变量的内存地址
printf("&g_a = %p, &s_c = %p, &i = %p\n", &g_a, &s_c, &i);
test();
return 0;
}
运行结果:
可以发现,对于全局静态变量它们随着定义依次存放在同一个区域
(3)栈区
存放:普通局部变量(非static