CC++内存管理

        1、C&C++内存分布

        

         如上代码中各变量的存储区域。

       1. 又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。

        2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口 创建共享共享内存,做进程间通信。

        3. 用于程序运行时动态内存分配,堆是可以上增长的。

        4. 数据段--存储全局数据和静态数据。

        5. 代码段--可执行的代码/只读常量。常量区是被保护的,不能被修改。

        那么为什么要分这些区域?------方便管理

        哪个是我们要重点关注的?-------。留给程序员自己控制的。

        我们先来看下面的一段代码和相关问题:

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";const 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在哪里?__C__  staticGlobalVar在哪里?__C__
staticVar在哪里?__C__   localVar在哪里?__A__
num1 在哪里?__A__char2在哪里?__A__    *char2在哪里?__A__     
pChar3在哪里?__A__   *pChar3在哪里?__D__
ptr1在哪里?__A__     *ptr1在哪里?__B__2. 填空题:
sizeof(num1) = __40__;
sizeof(char2) = __5__;    strlen(char2) = __4__;
sizeof(pChar3) = __4或8__;    strlen(pChar3) = __4__;
sizeof(ptr1) = __4或8__;3. sizeof 和 strlen 区别?
sizeof是运算符,编译时,内置类型根据类型大小定义计算大小,自定义类型根据内存对齐规则计算大小
strlen是字符串函数,运行时,编译器去call函数的地址,然后push,move等等,来实现strlen

        char2:在常量区有一个[abcd\0],然后在栈上开辟一个空间数组,然后拷贝过去。和num1是类似的。在语法上都代表整个数组。在栈上。

        *char2:这里即将首元素的地址解引用,即*char2 == a,也在栈上。

        pChar3:以const修饰的不一定代表是在常量区,pChar3是一个指针,是在栈上,它指向的是在常量区的[abcd\0]。在栈上。

        *pChar3:就是[abcd\0]这个字符串,在常量区。

        ptr1:代表我们开了一个空间,ptr1这个指针代表指向这个空间的首元素,在栈上。

        *ptr1:就是malloc开的空间,在堆上。

        sizeof(num1):代表整个数组的大小。

        sizeof(char2):代表整个数组的大小。有\0。

        sizeof(pChar3):代表pChar3这个指针的大小。

        strlen(char2)和strlen(pChar3):都是这个[abcd\0]的长度。

        2、C语言中动态内存管理方式:malloc/calloc/realloc/free

void Test()
{int* p1 = (int*)malloc(sizeof(int));free(p1);// 1.malloc/calloc/realloc的区别是什么?int* p2 = (int*)calloc(4, sizeof(int));int* p3 = (int*)realloc(p2, sizeof(int) * 10);// 这里需要free(p2)吗?free(p3);
}

         calloc和malloc的区别:calloc开辟空间后会初始化为0ÿ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/464842.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

静态时序分析:建立时间分析

静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析中,建立时间检查约束了触发器时钟引脚(时钟路径)和输入数据引脚(数据路径)之间的时序关系&#x…

《21天精通IPv4 to IPv6》第3天:IPv6地址配置——如何为不同的系统配置IPv6?

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

实现自定义标记

实现自定义标记 问题陈述 New Tech Book的高级管理层决定在其用JSP设计的应用程序的所有页面上显示版权信息。它们还要去如何向应用程序中添加JSP页面,可以重用显示版本信息的代码。公司的软件开发人员Jerry Smith决定用自定义标记来创建应用程序的这一部分。 解决方案 要解…

2024 年 5 款适用于免费 iPhone 数据恢复的工具软件

搜索一下,你会发现许多付费或免费的iPhone数据恢复工具声称它们可以帮助你以很高的成功率找回所有丢失的数据。然而,这正是问题所在。真的很难做出选择。为了进一步帮助您解决数据丢失问题,我们在此列出了 5 款最好的免费 iPhone 恢复软件供您…

Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)

文章目录 题目链接题意题解代码 题目链接 C. Digital Logarithm 题意 给两个长度位 n n n的数组 a a a、 b b b,一个操作 f f f 定义操作 f f f为, a [ i ] f ( a [ i ] ) a [ i ] a[i]f(a[i])a[i] a[i]f(a[i])a[i]的位数 求最少多少次操作可以使 …

【Linux系统学习】6.Linux系统软件安装

实战章节:在Linux上部署各类软件 前言 为什么学习各类软件在Linux上的部署 在前面,我们学习了许多的Linux命令和高级技巧,这些知识点比较零散,进行练习虽然可以基础掌握这些命令和技巧的使用,但是并没有一些具体的实…

日本的便宜服务器有哪些?

年底之际,无非是云服务器优惠的黄金时期,对于个人用户和独立开发者来说,无论你是搭建个人网站还是个人博客,现在都是行动的好时机。那么,对于这时要入手日本服务器的用户,该怎么找便宜厂商呢?这…

DRF 分页器的使用

drf提供了三个内置分页器,根据前端需求选择使用。 全局配置 在配置文件中设置全局的分页方式,如: REST_FRAMEWORK {DEFAULT_PAGINATION_CLASS: rest_framework.pagination.PageNumberPagination,PAGE_SIZE: 100 # 每页数目 }也可通过继…

深入理解 Nginx 插件及功能优化指南

深入理解 Nginx 插件及功能优化指南 深入理解 Nginx 插件及功能优化指南1. Nginx 插件介绍1.1 HTTP 模块插件ngx_http_rewrite_modulengx_http_access_module 1.2 过滤器插件ngx_http_gzip_modulengx_http_ssl_module 1.3 负载均衡插件ngx_http_upstream_modulengx_http_upstre…

【深度学习】手把手教你在远程服务器上跑 YOLOv3 相关代码(含环境配置)

前言 文章性质:实操记录 💻 主要内容:主要记录了如何配置项目环境以及如何在远程服务器上跑 yolov3 模型。 项目源码:GitHub - SZU-AdvTech-2022/213-Rethinking-Image-Restoration-for-Object-Detection 冷知识1:小伙…

【Linux】vim的基本操作与配置(下)

Hello everybody!今天我们继续讲解vim的操作与配置,希望大家在看过这篇文章与上篇文章后都能够轻松上手vim! 1.补充 在上一篇文章中我们说过了,在底行模式下set nu可以显示行号。今天补充一条:set nonu可以取消行号。这两条命令大家看看就可…

python+django+vue汽车票在线预订系统58ip7

本课题使用Python语言进行开发。基于web,代码层面的操作主要在PyCharm中进行,将系统所使用到的表以及数据存储到MySQL数据库中 使用说明 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 使用PyChar…