物流公司网站模版腾讯云 wordpress

news/2025/10/6 8:01:55/文章来源:
物流公司网站模版,腾讯云 wordpress,做网站相关人员,wordpress控制台欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看#xff0c;已成习惯 创作不易#xff0c;多多支持#xff01; 在这个波澜壮阔的内存地产世界中#xff0c;malloc、free、calloc和realloc四位主角#xff0c;共同演绎着一场场精彩绝伦的楼盘开…欢迎来到白刘的领域   Miracle_86.-CSDN博客 系列专栏  C语言知识 先赞后看已成习惯 创作不易多多支持 在这个波澜壮阔的内存地产世界中malloc、free、calloc和realloc四位主角共同演绎着一场场精彩绝伦的楼盘开发与交易大戏。 目录​​​​​​​ 一、为什么要有动态内存分配  二、malloc和free 2.1 malloc —— 购买土地 2.2 free —— 出售土地  三、calloc和realloc 3.1 calloc —— 批量购买并初始化土地 3.2 realloc —— 调整土地大小 四、常见的动态内存错误 4.1 对NULL指针解引用 4.2 对动态内存开辟空间的越界访问 4.3 对非动态开辟内存进行free释放 4.4 使用free释放动态开辟内存的一部分 4.5 对同一块动态内存多次释放 4.6 忘记释放内存泄漏 五、柔性数组 5.1 柔性数组的特点 5.2 柔性数组的使用  六、总结C/C中程序内存区域划分 一、为什么要有动态内存分配  我们已经掌握的内存开辟方法有 //变量 int val 20;//在栈空间上开辟四个字节//数组 char arr[10] { 0 };//在栈空间上开辟10个字节的连续空间 但是上述的开辟方法有两个缺点 1. 开辟的空间大小是有限的。 2. 数组在开辟的时候必须声明数组的长度数组空间一旦确定大小就不能调整。 但是对于空间的需求不仅仅是上述的情况。有时候我们需要的空间在程序运行的时候才能知道那数组的编译时开辟空间的方式就不能满足了。 所以在C语言中我们引入了动态内存开辟可以让程序员自己申请和释放空间就比较灵活了。 二、malloc和free 如果我们将内存比作地产那malloc和free就可以非常恰当地比作购买土地和出售土地。 2.1 malloc —— 购买土地 C语言中提供了一个动态内存开辟的函数 void* malloc(size_t size); malloc函数向内存申请一块连续可用的空间并返回指向这块空间的指针。 1. 如果开辟成功返回一个指向开辟好空间的指针。 2. 如果开辟失败返回NULL指针。因此malloc的返回值一定要检查。 3. 返回值类型为void*所以malloc函数并不知道开辟空间的类型具体在使用的时候程序员自己确定。 4. 如果参数size为0malloc的行为是标准未定义的取决于编译器。 2.2 free —— 出售土地  C语言提供了另外一个函数free专门是用来做动态内存的释放和回收的函数原型如下 void free(void* ptr); free函数用来释放动态开辟的内存。 1. 如果参数ptr指向的空间不是动态开辟的那free的行为是未定义的。 2. 如果参数ptr是NULL指针则什么也不做。 malloc和free都包含在stdlib.h头文件中。 eg #include stdio.h #include stdlib.h int main() {int num 0;scanf(%d, num);int arr[num] { 0 };int* ptr NULL;ptr (int*)malloc(num * sizeof(int));if (NULL ! ptr)//判断ptr指针是否为空{int i 0;for (i 0; i num; i){*(ptr i) 0;}}free(ptr);//释放ptr所指向的动态内存ptr NULL;//是否有必要return 0; } 首先定义了一个整数变量num并初始化为0。然后使用scanf函数从标准输入读取一个整数并存储在num中。然后声明了一个长度为num的整数数组arr并将其所有元素初始化为0。注意在C99标准之前这种变长数组VLA是不被允许的。但在C99及之后的版本中这是合法的。变长数组在之前我们也有所讲过 C语言中的百宝箱——数组2-CSDN博客 然后我们定义了一个整数指针ptr并初始化为NULL。 之后使用malloc函数动态分配了num个整数大小的内存并将返回的指针赋值给ptr。if语句首先检查ptr是否为NULL以确保内存分配成功。如果成功则使用一个循环将动态分配的内存的每一个位置初始化为0。紧接着我们使用free函数释放了ptr所指向的内存以避免内存泄漏。 最后我们为什么将ptr设置为空指针因为此时它是个野指针如果我们接下来对其操作将造成严重的后果再一个就是提高了代码可读性设置为空指针提示这块内存已经被释放了。 三、calloc和realloc calloc和realloc也可以有一个比较恰当的比喻批量购买并且初始化土地(在土地上盖房子)和调整土地大小。 3.1 calloc —— 批量购买并初始化土地 C语言中还有一个函数也是用来动态内存分配它就是calloc。原型如下 void* calloc(size_t num, size_t size); 1. 函数的功能是为num个大小为size的元素开辟一块空间并且把每块空间都初始化为0。 2. 与malloc的区别就是calloc会在返回地址之前将申请空间的每个字节都初始化为0。 eg: #include stdio.h #include stdlib.h int main() {int* p (int*)calloc(10, sizeof(int));if (NULL ! p){int i 0;for (i 0; i 10; i){printf(%d , *(p i));}}free(p);p NULL;return 0; } 运行结果 所以如果我们对申请的内存空间的内容要求初始化那么可以很方便的使用calloc函数来完成任务。 3.2 realloc —— 调整土地大小 realloc的出现让动态内存管理更加灵活。 有的时候我们会觉得申请的空间太小了有的时候又觉得太大了那为了合理的内存我们一定会对内存的大小做灵活的调整而realloc的作用就是可以做到对动态开辟内存的大小做调整。 函数原型 void* realloc(void* ptr, size_t size); 1. ptr是要调整的地址size是调整后的新大小。  2. 返回值为调整之后的内存起始位置。 3. 这个函数在调整原内存空间大小的基础上还会将原来内存中的数据移动到新的空间。 realloc在调整内存空间时存在两种情况 情况1原有空间之后有足够大的空间。 情况2原有空间之后没有足够大的空间。 当是情况1的时候要扩展内存就直接在原有内存之后直接追加空间原来空间的数据不发生变化。 当是情况2的时候原有空间之后没有足够的空间时扩展的方法是在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址。 由于上述两种情况我们在realloc的使用就要注意一些。 #include stdio.h #include stdlib.h int main() {int* ptr (int*)malloc(100);if (ptr ! NULL){//业务处理}else{return 1;}//扩展容量//代码1 - 直接将realloc的返回值放到ptr中ptr (int*)realloc(ptr, 1000);//这样可以吗(如果申请失败会如何)//代码2 - 先将realloc函数的返回值放在p中不为NULL在放ptr中int* p NULL;p realloc(ptr, 1000);if (p ! NULL){ptr p;}//业务处理free(ptr);return 0; } 代码1 这种直接使用realloc的方式是可行的但需要注意以下几点 返回值检查如果realloc函数调用失败它会返回NULL。这时原来的内存块由ptr指向也不会被释放所以需要确保在将realloc的返回值赋给ptr之前检查其返回值是否为NULL。 内存泄漏如果realloc失败并返回NULL而我们又没有保存原来的ptr的值那么将失去对原始内存块的引用从而导致内存泄漏。 代码2 这种方式更加安全因为它首先创建了一个新的指针p来保存realloc的返回值。如果realloc成功p将指向新的内存块然后你可以安全地将p的值赋给ptr。如果realloc失败p将为NULL但ptr仍然指向原来的内存块因此不会发生内存泄漏。 由于上述代码我们就不得不简单介绍几个常见的动态内存的错误。 四、常见的动态内存错误 4.1 对NULL指针解引用 void test() {int* p (int*)malloc(INT_MAX / 4);*p 20;//如果p的值是NULL就会有问题free(p); } 4.2 对动态内存开辟空间的越界访问 void test() {int i 0;int* p (int*)malloc(10 * sizeof(int));if (NULL p){exit(EXIT_FAILURE);}for (i 0; i 10; i){*(p i) i;//当i是10的时候越界访问}free(p); } 4.3 对非动态开辟内存进行free释放 void test() {int a 10;int* p a;free(p);//ok? } 4.4 使用free释放动态开辟内存的一部分 void test() {int* p (int*)malloc(100);p;free(p);//p不再指向动态内存的起始位置 } 4.5 对同一块动态内存多次释放 void test() {int* p (int*)malloc(100);free(p);free(p);//重复释放 } 4.6 忘记释放内存泄漏 void test() {int* p (int*)malloc(100);if (NULL ! p){*p 20;} } int main() {test();while (1); } 五、柔性数组 也许你从来没有听说过柔性数组flexible array这个概念但是它确实是存在的。 C99中结构体中的最后一个元素允许是未知大小的数组这就叫做“柔性数组”成员。 eg typedef struct st_type {int i;int a[0];//柔性数组成员 }type_a; 有的编译器可能会报错可以改成 typedef struct st_type {int i;int a[];//柔性数组成员 }type_a; 5.1 柔性数组的特点 1. 结构体中的柔性数组前面至少有一个成员。 2. sizeof返回结构体时不包括柔性数组的大小。 3. 包含柔性数组的结构体用malloc函数进行动态开辟并且分配的内存大小应该大于结构体的大小以适应柔性数组的大小。 5.2 柔性数组的使用  #include stdio.h #include stdlib.h #include string.h // 定义一个包含柔性数组成员的结构体 typedef struct { int count; double data[]; // 柔性数组成员 } FlexArray; int main() { int array_size 10; // 假设我们想要一个大小为10的数组 size_t struct_size sizeof(FlexArray) - sizeof(double[0]); // 计算结构体的固定部分大小 size_t total_size struct_size sizeof(double) * array_size; // 计算总大小 // 使用malloc分配内存 FlexArray *p (FlexArray *)malloc(total_size); if (p NULL) { perror(Memory allocation failed); return EXIT_FAILURE; } // 初始化结构体 p-count array_size; for (int i 0; i array_size; i) { p-data[i] i * 1.0; // 假设我们为数组填充一些值 } // 使用结构体... for (int i 0; i p-count; i) { printf(%f\n, p-data[i]); } // 释放内存 free(p); return 0; } 在这个例子中我们首先计算了结构体的固定部分大小不包括柔性数组成员然后加上柔性数组所需的大小计算出总大小。malloc函数被用来分配所需的总内存大小。 注意我们在计算结构体固定部分大小时使用了sizeof(double[0])这是为了确保在计算时不包括柔性数组成员。这个技巧依赖于sizeof对于数组类型返回的是数组的总大小即使数组的大小是0。 另外在使用柔性数组成员时要确保不要试图对结构体使用sizeof来获取完整大小因为这会返回不包含柔性数组成员的大小。总是根据你的需要动态地计算并分配内存。 最后别忘了在使用完分配的内存后调用free函数来释放它以避免内存泄漏。 六、总结C/C中程序内存区域划分 代码区Code Area 或 Text Area 也称为文本段或代码段它存放程序执行的二进制代码包括机器指令。这部分内存是只读的以防止程序意外地修改了它的指令。编译后的机器码CPU执行的指令就放在这一部分内存中。 全局/静态存储区Global/Static Storage Area 全局变量和静态变量的存储区域。全局变量包括在函数外部定义的变量而静态变量包括在函数内部使用static关键字定义的变量以及全局静态变量。这部分内存的生命周期是整个程序的执行期间。 堆区Heap Area 动态内存分配的区域通常使用malloc、calloc、realloc在C中分配内存或者在C中使用new操作符分配。程序员负责在不再需要时释放这部分内存否则会导致内存泄漏。 栈区Stack Area 由编译器自动分配和释放存放函数的参数值、局部变量等。其操作方式类似于数据结构中的栈。每次函数调用时都会在栈上为其分配一块内存用于存储函数的局部变量等。当函数返回时这块内存会被自动释放。

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

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

相关文章

想学编程做网站做it公司网站

1 准备 1.已安装好docker环境 2.已申请好域名 2 申请SSL证书 我使用的是腾讯云,申请免费的TrustAsia的SSL证书,阿里云等或者其他平台一般都会提供TrustAsia的SSL证书的 填好域名等相关信息,一般一天就可以下载证书了 3 docker安装Nginx …

网站类型分析设计说明怎么写200字

💡💡💡本文自研创新改进:MSAM(CBAM升级版):通道注意力具备多尺度性能,多分支深度卷积更好的提取多尺度特征,最后高效结合空间注意力 1)作为注意力MSAM使用; 推荐指数:五星 MSCA | 亲测在多个数据集能够实现涨点,对标CBAM。 改进1结构图如下: 《YOLOv…

服务器建站教程wordpress 目录菜单

系列目录 上一篇:白骑士的C语言教学高级篇 3.5 性能优化 在本项目中,我们将设计并实现一个简单的计算器程序,涵盖程序设计与实现、用户输入处理、算术运算与结果显示。该计算器可以进行基本的加减乘除运算,并能处理用户的连续输入…

免费的海报模板网站如何设置网站子域名

摘要 随着全球气候变化的加剧,生态保护已成为全球关注的焦点。天气预报API作为一种强大的工具,不仅能够提供实时的气象数据,还能在生态保护领域发挥重要作用。本文将探讨天气预报API如何帮助科学家、环保组织和政策制定者更好地理解和预测环…

罗湖做网站多少钱深圳设计平台

注册商标的时候都是要确定具体的产品或服务的,目前我国商标分类是用《类似商品和服务区分表–基于尼斯分类第十一版》2019年版这本分类书。这本分类表也是全球通用的分类表,商标分类总共有45个类别,1-34类是产品类、35-45类是服务类。这45个大…

企业网站的建设过程个人网站建设小江

在这个数字化快速发展的时代,垃圾回收系统的推广对于环境保护和可持续发展具有重要意义。为了更好地服务于垃圾回收行业,本文将分享如何使用第三方制作平台乔拓云网,定制开发搭建垃圾回收系统小程序。 首先,使用乔拓云网账号登录平…

休闲农庄展示网站wordpress 简书风格

1. webpack常用loader有哪些? babel-loader: 用于将 ES6 代码转换为向后兼容的 JavaScript 代码,以便在旧版本的浏览器中运行。css-loader: 用于加载 CSS 文件,并解析其中的 import 和 url 引用关系。style-loader&…

重庆广告公司前十名株洲seo优化官网

在Oracle中,判断联合索引是否生效可以通过以下几种方法: 执行计划(Execution Plan): 当你执行一个SQL查询时,Oracle会生成一个执行计划,显示如何最有效地执行该查询。你可以使用EXPLAIN PLAN命令来查看这…

做网站合成APP手机网站建设软件

一 代码 ffmpeg版本5.1.2,dll是:ffmpeg-5.1.2-full_build-shared。x64的。 文件、流地址对使用者来说是一样。 流地址(RTMP、HTTP-FLV、RTSP等):信令完成后,才进行音视频传输。信令包括音视频格式、参数等协商。 接流的在实际…

做阿里云网站的公司吗wordpress响应式按钮

本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用&#xff0…

推广网站的方法有搜索引擎韩城全员核酸检测

在CT等医学影像显示领域,我们经常会听到窗宽(Window Width,简写WW)、窗位(Window Level,简写WL)的概念,那么到底什么是窗宽、窗位,它们跟医学图像之间的关系又是什么? 先说一下CT值…

免费软件安装网站广州花都区

简述Python 中的每个值都有一个数据类型。在 Python 编程中,一切(万物)皆对象,数据类型实际上是类,变量是这些类的实例(对象)。简述数据类型Number数字String字符串List列表Tuple元组Set集合Dic…

服装网站建设价格开什么店投资小利润高

以下内容源于朱友鹏嵌入式课程的学习与整理,如有侵权请告知删除。 参考博客 同步通信与异步通信区别_wind19的博客-CSDN博客 SPI、I2C、UART(即串口)三种串行总线详解_天糊土的博客-CSDN博客_串口总线 一、电子通信相关的概念 1、同步通信和…

安装iTrustSSL证书 去除此网站不支持安全连接提示

当我们访问网站时,经常会遇到这样的问题提示: 此网站不支持安全连接 攻击者能够查看和复改您通过该网站发送或接收的信息。 如果您使用的是公共网络,安全起见,建议您稍后再访问此网站。使用您信任的网络 (例如家中…

中山市做网站实力数据库检索网站建设

Rockchip平台Android应用预安装功能(基于Android13) 1. 预安装应用类型 Android上的应用预安装功能,主要是指配置产品时,根据厂商要求,将事先准备好的第三方应用预置进Android系统。预安装分为以下几种类型: 安装不可卸载应用安…

网站自适应源码建网站要自己买服务器吗

用TyporapicgocloudflareTelegraph-image的免费,无需服务器,无限空间的图床搭建(避坑指南) 前提:有github何cloudflare (没有的话注册也很快) 首先,是一个别人写的详细的配置流程,傻瓜式教程&am…

河北建设厅官方网站网站设计便宜

gcc的流程 预处理 -E .i 编译 -s .s 把c语言编译为汇编 汇编 -c .o 把汇编编译为二进制 链接工程管理软件,它可以根据文件的时间戳进行编译,根据文件结构编译 app:main.o add.o gcc main.o add.o -o appmain.o:main.c gcc -c main.c -o main.oadd.o:…

新网站做百度百科竞价托管魏大帅

spingboot整合Swagger教程 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我将和大家分享一项对于Java后端开发极为重要的技术——“Spring Boot整…

成都可以做网站的公司成都设计公司第一名

一. IIS各版本间的区别 IIS 5.0 IIS 5.1 IIS 6.0 平台 Windows 2000 Windows XP Professional Windows Server 2003 家族 体系结构 32 位 32 位和 64 位 32 位和 64 位 应用程序进程模型 TCP/IP 内核 DLLhost.exe(处于中等或高应用程序隔离模式下的多个…

企业网站框架图wordpress 4.01

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 认识QtSDK中的重要工具 文章编号:Qt 学习笔记 / 03 文章目…