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

C++典型例题切入数据存储

一、典例导入 

int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{static int staticVar = 1;int localVar = 1;int num1[10] = {1, 2, 3, 4};char char2[] = "abcd";char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof (int)*4);int* ptr2 = (int*)calloc(4, sizeof(int));int* ptr3 = (int*)realloc(ptr2, sizeof(int)*4);free (ptr1);free (ptr3);
}

1. 选择题:

  选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)

  globalVar在哪里?____  staticGlobalVar在哪里?____

  staticVar在哪里?____  localVar在哪里?____

  num1 在哪里?____

  char2在哪里?____   *char2在哪里?___

  pChar3在哪里?____   *pChar3在哪里?____

  ptr1在哪里?____    *ptr1在哪里?____

2. 填空题:

  sizeof(num1) = ____;  

  sizeof(char2) = ____;   strlen(char2) = ____;

  sizeof(pChar3) = ____;   strlen(pChar3) = ____;

  sizeof(ptr1) = ____;

二、地址空间

三、逐个解析

3.1 选择题

globalVar在哪里?数据段 C

staticGlobalVar在哪里?数据段 C

staticVar在哪里?数据段 C

  • 全局变量(包括被 static 修饰的):无论是否使用 static 修饰,全局变量都存储在数据段。不过,static 关键字限制了全局变量的可见性,仅在声明它的文件内可见。这意味着,尽管静态全局变量在数据段中,但它们不能被程序中其他文件直接访问。
  • 已初始化的静态全局变量:存储在数据段的 .data 部分。
  • 未初始化或初始化为零的静态全局变量:为了节省空间,通常存储在 .bss 部分,该部分在程序启动时被清零。

localVar在哪里?栈区 A

  • 局部变量(被 static 修饰):这些变量虽然在其所在函数的作用域外不可见,但由于 static 修饰符的作用,它们实际上存储在数据段中,而不是通常存放局部变量的栈上。这样它们就能在函数调用之间保持状态,不会像其他自动存储期变量那样在函数调用结束时丢失值。
  • 局部变量(未被 static 修饰):存放在栈区。
  • 已初始化的静态局部变量:类似于静态全局变量,存储在 .data 部分。
  • 未初始化或初始化为零的静态局部变量:存储在 .bss 部分。

 

 num1 在哪里? 栈区 A

num1是数组名,指的是整个数组,数组成员都是临时变量,存放在栈中。

 char2在哪里? 栈区 A

char2 和 num1 的情况类似,虽然后面是一个字符串,存放在代码区,但是系统会在栈上开辟一段空间存放拷贝的 "abcd\0" ,char2 代表整个数组,存放在栈区:

*char2在哪里? 栈区 A 

char2 指向的是数组的首元素,对 char2 解引用拿到的是数组的首元素,整个数组都存放在栈区中,故 *char2 也在栈区中:

 pChar3在哪里? 栈区 A

pChar3 是指针,其指向代码段的常量字符串,但是它也是临时变量,存放在栈区中:

*pChar3在哪里? 代码区 D

pChar3 指向代码段的常量字符串,故对其解引用拿到的是常量字符串的首字符:

ptr1在哪里?栈区 A 

ptr1 和 pChar3 类似,他们都是作为指针出现的临时变量,故存放在栈区。

*ptr1在哪里?堆区 B

ptr1 指向的是一块 malloc 的空间, malloc 的空间存放在堆区,故对其解引用拿到的是堆区的空间。

3.2 填空题

sizeof(num1) = ____;  40 

int类型4byte,个数10,sizeof(nums1) = 4 * 10 = 40

sizeof(char2) = ____;  5

sizeof 统计时会统计 \0

strlen(char2) = ____;  4

strlen 统计时不会统计 \0

sizeof(pChar3) = ____;  4/8

pChar3 是指针,指针的大小在32位或64位机器上有差别,但一定是 4/8

strlen(pChar3) = ____;

pChar3 保存的是字符串 "abcd" 第一个字符 'a' 的内存地址,故 strlen 为 4

  sizeof(ptr1) = ____;

ptr1 是指针,同 pChar3

相关文章:

  • 07 | Swoole 源码分析之 Channel 通道模块
  • 大语言模型RAG vs. 长文本
  • 【Linux】make是如何判断可执行文件是否需要重新编译呢?(ACM时间)
  • 基于springboot+vue+Mysql的职称评审管理系统
  • SQL语句的编写
  • 将博客搬至稀土掘金中
  • pipeline流水线学习
  • C数据结构:单链表
  • MySQL innoDB存储引擎多事务场景下的事务执行情况
  • java操作linux
  • Covalent Network(CQT)推出以太坊质押迁移计划,以增强长期结构化数据可用性、塑造万亿级 LLM 参数体系
  • 输入输出系统的发展历程
  • python + jdbc 连接 达梦数据库
  • 在Linux系统上实现TCP(socket)通信
  • c++20协程详解(三)
  • @angular/forms 源码解析之双向绑定
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • Docker容器管理
  • Laravel Telescope:优雅的应用调试工具
  • MD5加密原理解析及OC版原理实现
  • spring security oauth2 password授权模式
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 从零开始学习部署
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 关于Flux,Vuex,Redux的思考
  • 基于webpack 的 vue 多页架构
  • 力扣(LeetCode)56
  • 马上搞懂 GeoJSON
  • 前端性能优化--懒加载和预加载
  • 人脸识别最新开发经验demo
  • 入口文件开始,分析Vue源码实现
  • 三分钟教你同步 Visual Studio Code 设置
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 思否第一天
  • 微信小程序设置上一页数据
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  •  一套莫尔斯电报听写、翻译系统
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • k8s使用glusterfs实现动态持久化存储
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #ifdef 的技巧用法
  • #pragma pack(1)
  • (C语言)逆序输出字符串
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (搬运以学习)flask 上下文的实现
  • (二)Linux——Linux常用指令
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十六)Flask之蓝图
  • (转)Windows2003安全设置/维护
  • (转)用.Net的File控件上传文件的解决方案
  • .NET Core 项目指定SDK版本
  • .NET 中的轻量级线程安全
  • .NET设计模式(11):组合模式(Composite Pattern)