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

业务宣传网站建设ImQQ网站是怎么做的

业务宣传网站建设,ImQQ网站是怎么做的,drupal 网站开发,网上公司注册申请的流程博主介绍:程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章,首发gzh,见文末👇&#x1f…

博主介绍:程序喵大人

  • 35- 资深C/C++/Rust/Android/iOS客户端开发
  • 10年大厂工作经验
  • 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
  • 《C++20高级编程》《C++23高级编程》等多本书籍著译者
  • 更多原创精品文章,首发gzh,见文末
  • 👇👇记得订阅专栏,以防走丢👇👇
    😃C++基础系列专栏
    😃C语言基础系列
    😃C++大佬养成攻略

在C++编程中,内存管理是一个至关重要的概念。

要深入理解内存管理,我们肯定要了解堆内存和栈内存的基本概念、区别以及它们的动态分配和释放方法。还需要深入理解相关内存分配函数malloccallocrealloc的用法。

基本概念理解

栈内存

栈内存是由编译器自动管理的内存区域,用于存储局部变量、函数参数和返回地址等。栈内存的分配和释放是自动进行的:

  • 当函数被调用时,局部变量和参数会被压入栈中;
  • 当函数返回时,这些局部变量和参数会被弹出栈并释放。

栈内存具有快速分配和释放的特点,但其大小是固定的,一般也就8M左右,不能动态调整。

堆内存

堆内存是由程序员手动管理的内存区域,用于动态分配内存。

你通过malloccallocrealloc等函数可以在堆上分配内存,通过free函数释放内存。

堆内存的大小不固定,可以动态调整,但需要程序员负责内存的管理,容易出现内存泄漏等问题,我们常说的内存泄露问题指的更多的就是堆内存的泄露。

区别

  • 内存****管理:栈内存由编译器自动管理,堆内存由程序员手动管理。
  • 作用域:栈内存的作用域通常是函数内部,当函数返回时,栈内存会自动被释放;堆内存的作用域由程序员控制,只要程序员不释放,内存就会一直存在。
  • 生命周期:栈内存的生命周期与函数执行时间相关,函数执行完毕后,栈内存会被释放;堆内存的生命周期由程序员控制,直到显式调用free函数释放内存。

堆内存的使用

使用malloc动态分配空间

malloc函数用于在堆上分配指定大小的内存块。函数声明形式为:

void* malloc(size_t size);
  • size:要分配的字节数。
  • 返回值:指向分配的内存块的指针,如果分配失败,返回NULL

示例代码:

int* ptr = (int*)malloc(sizeof(int) * 10); // 分配10个int类型的内存空间
if (ptr == NULL) {// 处理内存分配失败的情况
}

使用calloc分配并初始化内存

calloc函数用于在堆上分配内存并初始化为0。函数声明形式为:

void* calloc(size_t num, size_t size);
  • num:要分配的元素个数。
  • size:每个元素的字节数。
  • 返回值:指向分配的内存块的指针,如果分配失败,返回NULL

示例代码:

int* ptr = (int*)calloc(10, sizeof(int)); // 分配10个int类型的内存空间,并初始化为0
if (ptr == NULL) {// 处理内存分配失败的情况
}

使用realloc调整内存大小

realloc函数用于调整已分配内存块的大小。函数声明形式为:

void* realloc(void* ptr, size_t size);
  • ptr:指向要调整大小的内存块的指针。
  • size:新的内存块大小(字节数)。
  • 返回值:指向新的内存块的指针,如果分配失败,返回NULL,原内存块保持不变。

示例代码:

int* ptr = (int*)malloc(sizeof(int) * 10); // 初始分配10个int类型的内存空间
if (ptr == NULL) {// 处理内存分配失败的情况
}// 使用realloc调整内存大小
ptr = (int*)realloc(ptr, sizeof(int) * 20);
if (ptr == NULL) {// 处理内存调整失败的情况,注意原内存块仍然有效
}

使用free释放内存

free函数用于释放之前通过malloccallocrealloc分配的内存空间。函数声明形式为:

void free(void* ptr);
  • ptr:指向要释放的内存块的指针。

示例代码:

int* ptr = (int*)malloc(sizeof(int) * 10); // 分配10个int类型的内存空间
if (ptr == NULL) {// 处理内存分配失败的情况
}// 使用内存...free(ptr); // 释放内存
ptr = NULL; // 将指针置为NULL,避免悬挂指针

栈内存与堆内存的对比

编程实践展示

以下示例展示了栈内存和堆内存的不同使用场景和特性:

#include <stdio.h>
#include <stdlib.h>void stackMemoryExample() {int stackVar = 10; // 栈内存,函数返回时自动释放printf("Stack variable: %d\n", stackVar);
}void heapMemoryExample() {int* heapVar = (int*)malloc(sizeof(int)); // 堆内存,需要手动释放if (heapVar == NULL) {fprintf(stderr, "Memory allocation failed\n");return;}*heapVar = 20;printf("Heap variable: %d\n", *heapVar);free(heapVar); // 释放堆内存heapVar = NULL; // 避免悬挂指针
}int main() {stackMemoryExample(); // 调用栈内存示例函数heapMemoryExample();  // 调用堆内存示例函数return 0;
}

其中

stackMemoryExample函数使用了栈内存来存储局部变量stackVar,当函数返回时,stackVar会自动释放。

heapMemoryExample函数则使用堆内存来存储变量heapVar,并通过malloc分配内存,通过free释放内存。

练习

  1. 编写一个程序,动态分配一个整型数组的内存空间,用于存储用户输入的5个整数,然后遍历并打印这些整数。最后,释放分配的内存。
  2. 编写一个程序,包含两个函数。第一个函数使用栈内存(局部变量)存储并打印一个整数数组;第二个函数使用堆内存动态分配并存储用户输入的整数数组,然后打印并释放内存。通过这两个函数的调用,展示栈内存和堆内存在使用上的区别。

进阶

  1. 为什么malloc时候需要传递长度信息,而free时候却不需要传递长度信息呢?会不会多释放一些内存或者少释放了一些内存?
  2. malloc更底层的原理是什么?一次malloc底层都经历了什么?
  3. 栈内存和堆内存的区别?
  4. 什么场景下使用栈,什么场景下使用堆呢?
  5. 栈数组下标越界访问会发生什么?
  6. 什么是栈溢出?
  7. 了解下常见的栈攻击手段。

码字不易,欢迎大家点赞关注评论,谢谢!


C++训练营

专为校招、社招3年工作经验的同学打造的1V1 C++训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得offer!训练营介绍


文章转载自:

http://s4cBv7Vi.bpmdq.cn
http://tSGnvAnH.bpmdq.cn
http://7lfHkSq8.bpmdq.cn
http://1IXD80ns.bpmdq.cn
http://E4KQXhab.bpmdq.cn
http://YDeu9NcG.bpmdq.cn
http://mOjFvpHT.bpmdq.cn
http://NdDUf4l0.bpmdq.cn
http://iq26aACs.bpmdq.cn
http://QiChLOds.bpmdq.cn
http://gEReQk1N.bpmdq.cn
http://IdUII2KT.bpmdq.cn
http://hehrUaiq.bpmdq.cn
http://owj3MeZn.bpmdq.cn
http://87wXAWgr.bpmdq.cn
http://TNDkvcND.bpmdq.cn
http://9A22VdER.bpmdq.cn
http://eMyDGOUf.bpmdq.cn
http://O4Tvaksz.bpmdq.cn
http://CN17mWau.bpmdq.cn
http://TdUIwGK4.bpmdq.cn
http://rSEWRk12.bpmdq.cn
http://EOlAU2M6.bpmdq.cn
http://VD522Wys.bpmdq.cn
http://UtPpzAuz.bpmdq.cn
http://s0sXKuSs.bpmdq.cn
http://dFTs0LZU.bpmdq.cn
http://BRfKYFNj.bpmdq.cn
http://MW1B3rgg.bpmdq.cn
http://R806evhX.bpmdq.cn
http://www.dtcms.com/wzjs/647546.html

相关文章:

  • 程序员不是做网站的南昌企业网站设计
  • 网站建设小细节图片小型互联网公司市值排名
  • 写资料的网站有哪些用自己的话回答网络营销是什么
  • 闵行区网站设计网站建设有什么理论依据
  • 沈阳网站开发公司怎么做网页背景
  • 广州做网页做网站优化竞价区别
  • 双语企业网站源码深圳家园网社区论坛
  • 电脑版传奇网站深圳网站建设哪家好
  • 公司网站建设是哪个部门的事情?个人网页设计开题报告
  • 南京制作公司网站深圳手机网站设计
  • 可以做海报的网站网站标题关键词怎么做
  • 织梦cms可以做外贸网站吗网页设计后面是网站建设吗
  • 云网站制作的流程图国产长尾关键词拘挖掘
  • 郑州网站建设公司有哪些网页设计的首页版式
  • 合肥专门做网站杭州省建设厅网站
  • 做简历网站 39东阳网站建设
  • 团购网站怎么做南昌官网seo
  • 磐安网站建设公司asp 网站运行
  • 广东省农业农村厅网站东莞行业推广
  • 网站定制需求达州建设企业网站
  • 上传照片的网站赚钱网站建设公司宣传范文
  • 重庆建设网站多久时间网站模块规划
  • 北京珠宝网站建设dedecms购物网站
  • dede网站如何换源码wordpress菜单排序
  • 网站营销案例展示多企业宣传网站建设
  • 贵州城乡建设部网站推广网站可以做跳转吗
  • 百度收录提交之后如何让网站更快的展示出来单页营销型网站模板
  • 宿州网站建设费用怎么样才能在网上卖东西
  • 凡科做的网站怎么打不开了wordpress更改中文版后还是英文
  • 温州市微网站制作电话c s网站开发模式