当前位置: 首页 > news >正文

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 <stdio.h>#include <stdlib.h>#include <string.h>//全局变量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!!!]
http://www.lryc.cn/news/215917.html

相关文章:

  • Unity Animator cpu性能测试
  • 数据结构 - 顺序表ArrayList
  • 【Echarts】玫瑰饼图数据交互
  • k8s、pod
  • 一天掌握python爬虫【基础篇】 涵盖 requests、beautifulsoup、selenium
  • 睿趣科技:想知道开抖音小店的成本
  • python项目部署代码汇总:目标检测类、人体姿态类
  • 力扣每日一题92:反转链表||
  • Vue+OpenLayers从入门到实战进阶案例汇总目录,兼容OpenLayers7和OpenLayers8
  • C#中使用LINQtoSQL管理SQL数据库之添加、修改和删除
  • 飞致云及其旗下1Panel项目进入2023年第三季度最具成长性开源初创榜单
  • Maven实战-私服搭建详细教程
  • uniapp-自定义表格,右边操作栏固定
  • 基于Electron27+React18+ArcoDesign客户端后台管理EXE
  • QT5交叉编译保姆级教程(arm64、mips64)
  • python计算图片的RGB值,可以作为颜色的判断条件
  • oracle 日期
  • JVM堆内存解析
  • C#Onnx模型信息查看工具
  • RK3588 ubuntu系统安装opencv
  • 常用的vue UI组件库
  • 防范欺诈GPT
  • 【Java】多线程案例(单例模式,阻塞队列,定时器,线程池)
  • STM32:使用蓝牙模块
  • Blazor 虚拟滚动/瀑布流加载Table数据
  • 数字化浪潮下,AI数字人融入多元化应用场景
  • JVM虚拟机:JVM的垃圾回收清除算法(GC)有哪些
  • 我应该删除低质量页面以提高Google排名吗?
  • 【实战Flask API项目指南】之六 数据库集成 SQLAlchemy
  • MFC网络通信-Udp服务端