C语言学习之内存区域的划分

  • 内存区域的划分:
  • 32位OS可以访问的虚拟内存空间0~4G
  • 一、内核空间:
  • 3~4G;
  • 二、用户空间
  • 0~3G;
  • 栈区局部变量栈区分配、由OS负责分配和回收
  • 堆区:由程序员手动分配(malloc函数)和回收(free函数);
  • 静态区
  • .bss段未初始化的全局变量或者使用static修饰未初始化的全局变量或者局部变量;
  • .data段初始化的全局变量或者使用static修饰初始化的全局变量或者局部变量;
  • .rodata段:顾名思义“read only”,只读数据段,例如字符串常量
  • .text段:存放代码段;
  • 存储类型为const的变量注意事项:
  • const可以修饰普通类型的变量,也可以修饰指针类型的变量,还可以用来修饰函数的形参返回值
  • 修饰的全局变量存储在.rodata段不可以被修改,通过指针的方式也不可以被修改,定义常量时,必须在定义时进行初始化
  • 修饰的局部变量栈区分配空间,不可以通过常量的变量名本身进行修改,But可以通过指针修改使用const修饰局部变量
  • 示例代码:
	#include 
	#include 
	#include 
	
	//全局变量
	
	int a;  //静态区/.bss段
	
	int b = 999;    //静态区/.data段
	
	const int c = 666;  //静态区/.rodata段
	
	static int d;   //静态区/.bss段
	
	static int e = 555; //静态区/.data段
	
	char a1[128];   //静态区/.bss段
	
	char a2[128] = "I Love China!!!";   //静态区/.data段
	
	char *p;   //静态区/.bss段
	
	char *q = "I LIKE U!!!";    //静态区/q在.data段,而字符串“I LIKE U!!!”在.rodata段
	
	//局部变量
	void var_init()
	{
	    int a;  //栈区
	
	    int b = 999;    //栈区
	
	    const int c = 666;  //栈区
	
	    printf("c = [%d]\n",c);
	
	    int *m = &c;
	
	    *m = 99;
	
	    printf("*m = [%d]\n",*m);
	
	    printf("c = [%d]\n",c);
	
	    static int d;   //静态区/.bss段
	
	    static int e = 555; //静态区/.data段
	
	    char a1[128];   //栈区
	
	    char a2[128] = "I Love China!!!";   //栈区
	
	    char *p;   //栈区
	
	    char *q = "I LIKE U!!!";    //q在栈区,而字符串“I LIKE U!!!”在.rodata段
	
	    printf("a= [%d]\n",a);
	    printf("b= [%d]\n",b);
	    printf("d= [%d]\n",d);
	    printf("e= [%d]\n",e);
	    printf("a1[0] = [%d]\n",a1[0]);
	    printf("a2 = [%s]\n",a2);
	    printf("p = [%p]\n",p);
	
	    puts("----------------------------------------------------------");
	
	    p = (char *)malloc(sizeof(char));     //堆区/局部变量
	
	    printf("*p = [%d]\n",*p);
	
	    printf("p = [%p]\n",p);
	
	    puts("----------------------------------------------------------");
	
	    free(p);
	
	    p = NULL;
	
	    printf("p = [%p]\n",p);
	
	    puts("----------------------------------------------------------");
	
	    printf("q = [%s]\n",q);
	    
	}
	
	
	
	int main(int argc, char const *argv[])
	{
	    printf("a= [%d]\n",a);
	    printf("b= [%d]\n",b);
	    printf("c= [%d]\n",c);
	    printf("d= [%d]\n",d);
	    printf("e= [%d]\n",e);
	    printf("a1[0] = [%d]\n",a1[0]);
	    printf("a2 = [%s]\n",a2);
	    printf("p = [%p]\n",p);
	
	    p = (char *)malloc(sizeof(char));     //堆区/全局变量
	
	    printf("*p = [%d]\n",*p);
	
	    free(p);
	
	    p = NULL;
	
	    printf("p = [%p]\n",p);
	
	    printf("q = [%s]\n",q);
	
	
	    puts("************************************************************");
	
	    var_init();
	   
	    return 0;
	}

  • 运行结果:
	a= [0]
	b= [999]
	c= [666]
	d= [0]
	e= [555]
	a1[0] = [0]
	a2 = [I Love China!!!]
	p = [(nil)]
	*p = [0]
	p = [(nil)]
	q = [I LIKE U!!!]
	************************************************************
	c = [666]
	*m = [99]
	c = [99]
	a= [0]
	b= [999]
	d= [0]
	e= [555]
	a1[0] = [-128]
	a2 = [I Love China!!!]
	p = [0xe37732c0bf8d7700]
	----------------------------------------------------------
	*p = [0]
	p = [0x564b6b388670]
	----------------------------------------------------------
	p = [(nil)]
	----------------------------------------------------------
	q = [I LIKE U!!!]

你可能感兴趣的:(C语言学习系列,c语言,学习,linux,算法,基础)