营销型网站软件建立网站需要多少钱就蓷y湖南岚鸿推荐

news/2025/9/22 23:59:39/文章来源:
营销型网站软件,建立网站需要多少钱就蓷y湖南岚鸿推荐,电信专线可以做网站吗,做网站上哪买空间目录 一、为什么要有动态内存分配​ 二、C/C中程序内存区域划分​ 三、malloc和free​ 2.1、malloc 2.2、free​ 四、calloc和realloc​ 3.1、calloc​ 3.2、realloc​ 3.3realloc在调整内存空间的是存在两种情况#xff1a; 3.4realloc有malloc的功能 五、常见的动…目录 一、为什么要有动态内存分配​ 二、C/C中程序内存区域划分​ 三、malloc和free​ 2.1、malloc 2.2、free​ 四、calloc和realloc​ 3.1、calloc​ 3.2、realloc​ 3.3realloc在调整内存空间的是存在两种情况  3.4realloc有malloc的功能 五、常见的动态内存的错误​ 5.1对NULL指针的解引用操作​ 5.2对动态开辟空间的越界访问​ 5.3对非动态开辟内存使用free释放​ 5.4使用free释放一块动态开辟内存的一部分​ 5.5对同一块动态内存多次释放 5.6动态开辟内存忘记释放内存泄漏 忘记释放不再使用的动态开辟的空间会造成内存泄漏。切记动态开辟的空间一定要释放并且正确释放。 六、动态内存经典笔试题分析 题目1​ 第一个问题strcpy中的参数为空指针 第二个问题内存泄漏 正确的写法 解法一 解法二 题目2 题目3 题目4 一、为什么要有动态内存分配​ 我们已经掌握的内存开辟方式有 int val 20;//在栈空间上开辟四个字节​ char arr[10] {0};//在栈空间上开辟10个字节的连续空间​ 但是上述的开辟空间的方式有两个特点• 空间开辟大小是固定的。 • 数组在申明的时候必须指定数组的长度数组空间一旦确定了大小不能调整 int main() {     int n 0;//     char ch a;     //数组 - 存放一个班的数学成绩     int arr[30] { 0 };     return 0; } 但是对于空间的需求不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知 道那数组的编译时开辟空间的方式就不能满足了。 C语言引入了动态内存开辟让程序员自己可以申请和释放空间就比较灵活了。、 二、C/C中程序内存区域划分​ 以下为对内存开辟理解有帮助的概念 C/C程序内存分配的几个区域 1. 栈区stack在执行函数时函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中效率很高但是分配的内 存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。​ 2. 堆区heap一般由程序员分配释放 若程序员不释放程序结束时可能由OS回收 。分配方式类似于链表。 3. 数据段静态区static存放全局变量、静态数据。程序结束后由系统释放。​ 4. 代码段存放函数体类成员函数和全局函数的二进制代码。 对于以下函数它们的内存分布关系如下 三、malloc和free​ malloc和free都声明在 stdlib.h 头文件中。 2.1、malloc C语言提供了一个动态内存开辟的函数​ void* malloc (size_t size); 这个函数向内存的堆区申请一块连续可用的空间并返回指向这块空间的指针。 如果开辟成功则返回一个指向开辟好空间的指针。 如果开辟失败则返回一个 NULL 指针因此malloc的返回值一定要做检查。 返回值的类型是 void* 所以malloc函数并不知道开辟空间的类型具体在使用的时候使用者自己来决定。 如果参数 size 为0malloc的行为是标准是未定义的取决于编译器。 malloc函数申请的内存空间当程序退出时才会还给操作系统。程序不退出动态申请的空间不会销毁。 int main() {//int arr[10];//int* p (int*)malloc(40);int* p (int*)malloc(10 * sizeof(int));//开辟一个空间这个空间占10个整型字节if (p NULL){perror(malloc);//如果前面的 malloc 函数调用失败(即没有成功分配内存),//则输出与 malloc 相关的错误消息。return 1;}int i 0;//使用 - 给数组赋值//如果不赋值,则malloc中的值为随机值for (i 0; i 10; i){*(p i) i;}//打印for (i 0; i 10; i){printf(%d , *(p i));}//释放空间free(p);//free操作,只会把p指向的空间还给操作系统,//但是p中放入的地址依然是起始地址,这样操作很危险//为什么free函数没有把p置为空呢?//在void free (void* ptr);中//void*ptr是传值调用//ptr是p的临时拷贝,他没有办法修改p指向的值//如果用传址调用,如void**ptr,则可以修改p指向的值p NULL;//防止p变为野指针return 0;} 2.2、free​ C语言提供了另外一个函数free专门是用来做动态内存的释放和回收的 函数原型如下​ void free (void* ptr); free函数用来释放动态开辟的内存。​ 如果参数 ptr 指向的空间不是动态开辟的那free函数的行为是未定义的。 如果参数 ptr 是NULL指针则函数什么事都不做。 四、calloc和realloc​ 3.1、calloc​ C语言还提供了一个函数叫 calloc calloc 函数也用来动态内存分配。 原型如下​ void* calloc (size_t num, size_t size); 函数的功能是为 num 个大小为 size 的元素开辟一块空间并且把空间的每个字节初始化为0。 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。 举个例子​ 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); ptr 是要调整的内存地址 size 调整之后新大小 返回值为调整之后的内存起始位置。 这个函数调整原内存空间大小的基础上还会将原来内存中的数据移动到新的空间。 3.3realloc在调整内存空间的是存在两种情况  ◦ 情况1原有空间之后没有足够大的空间​ ◦ 情况2原有空间之后有足够大的空间​ 情况1​ 当是情况1的时候原有空间之后没有足够多的空间时扩展的方法是在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存地址。 情况2​ 当是情况2的时候要扩展内存就直接原有内存之后直接追加空间原来空间的数据不发生变化。 由于上述的两种情况realloc函数的使用就要注意一些。​ int main() {//int arr[10];//int* p (int*)malloc(40);int* p (int*)calloc(10 , sizeof(int));if (p NULL){perror(malloc);//如果前面的 malloc 函数调用失败(即没有成功分配内存),//则输出与 malloc 相关的错误消息。return 1;}int i 0;//打印for (i 0; i 10; i){printf(%d , *(p i));}//空间不够,想要扩大空间,20个整型int*ptr (int*)realloc(p, 20 * sizeof(int));// 使用realloc函数尝试将已分配的内存空间扩大到能容纳20个整型变量的空间 // 注意这里使用了临时指针ptr来接收realloc的返回值,//以防realloc失败返回NULL时导致原指针丢失if (ptr ! NULL){p ptr;}else {perror(realloc);return 1;}//使用空间了//释放空间free(p);p NULL;//防止p变为野指针return 0; } 3.4realloc有malloc的功能 realloc函数出了调整空间外还能实现与malloc相同的功能 int main() {int* p (int*)realloc(NULL, 40);//int* p (int*)malloc(100);//释放空间free(p);p NULL;return 0;} 五、常见的动态内存的错误​ 5.1对NULL指针的解引用操作​ void test(){int *p (int *)malloc(INT_MAX/4);*p 20;//如果p的值是NULL就会有问题​free(p);}正确写法 int main() {int* p (int*)malloc(100);if (p NULL){//报错信息perror(malloc);return 1;}*p 20;//p有可能是NULL指针的//释放free(p);p NULL;return 0; } 5.2对动态开辟空间的越界访问​ int main() {int* p (int*)malloc(40);if (p NULL){return 1;}//使用int i 0;for (i 0; i 10; i){*(p i) i;//当循环到第十一次时就越界访问了}//free(p);p NULL;return 0; } 正确写法   在这个修正版本中增加了一个变量capacity来设置当前分配的内存可以存储多少整数并在需要时使用realloc来增加容量。 int main() {int capacity 10;//记录设置空间的容量大小int* p (int*)malloc(capacity * sizeof(int));if (p NULL){return 1;}//使用int i 0;for (i 0; i 10; i){if (i capacity)//判断i是否为capacity{capacity (capacity * 2) * sizeof(int);//如果是再加一倍p (int*)realloc(p, capacity);//调整内存空间}*(p i) i;}for (i 0; i 10; i){printf(%d , *(p i));}free(p);p NULL;return 0; }5.3对非动态开辟内存使用free释放​ void test() {int a 10;int* p a;free(p);//ok? } int main() {int a 10;int* p (int*)malloc(40);if (p NULL){return 1;}//使用//...p a;//p指向的空间就不再是堆区上的空间free(p);p NULL;return 0; } 在这段代码中首先使用malloc分配了一块内存并将指针p指向这块内存。然后p又指向了变量a的地址。此时失去了对之前分配的内存的引用因为没有任何指针指向它了。这就意味着你无法再访问或释放这块内存了这被称为内存泄漏memory leak。 所以此时正确的做法是不指向a直接释放p的内存空间 5.4使用free释放一块动态开辟内存的一部分​ void test(){int *p (int *)malloc(100);p;free(p);//p不再指向动态内存的起始位置​}free(p); 这行代码试图释放指针 p 所指向的内存。但是因为 p 已经不再指向动态内存块的起始位置这个操作是未定义的undefined behavior。这可能会导致程序崩溃或者更糟糕的是它可能会默默地破坏你的数据而不给出任何明显的错误迹象。 如果你需要对指针进行算术运算可以保存原始指针的一个副本以便稍后用于释放内存。 正确写法 void test() { int *original_p (int *)malloc(100); int *p original_p; // 对 p 进行操作... p; // 使用原始指针来释放内存 free(original_p); } 5.5对同一块动态内存多次释放 void test() {int* p (int*)malloc(100);free(p);free(p);//重复释放​ } 5.6动态开辟内存忘记释放内存泄漏 void test() {int* p (int*)malloc(100);if (NULL ! p){*p 20;}free(p);p NULL; }int main() {test();while (1); } 忘记释放不再使用的动态开辟的空间会造成内存泄漏。 切记动态开辟的空间一定要释放并且正确释放。 六、动态内存经典笔试题分析 题目1​ void GetMemory(char *p){p (char *)malloc(100);}void Test(void){char *str NULL;GetMemory(str);strcpy(str, hello world);printf(str);}请问运行Test 函数会有什么样的结果​ 答程序崩溃 此处代码有两个问题 第一个问题strcpy中的参数为空指针 GetMemory 函数采用的是值传递实参 str 是一个字符指针变量形参同样用字符指针变量 p 来接收形参是实参的一份临时拷贝此时 p 和 str 是各自独立的两个指针变量但它们都是空指针此时在函数内部让 p 重新指向新开辟出来的空间此时 p 就不是空指针了当GetMemory 函数结束的时候 p 会被释放掉接下来执行 strcpy 但此时此刻的 str 依然是一个空指针NULL 是地址为0的内存空间这块空间是不允许去访问的因此在执行 strcpy 的时候程序会报错。 第二个问题内存泄漏 GetMemory 函数中动态申请的空间没有释放占用了内存空间。 正确的写法 解法一 void GetMemory(char** p)//形参用二级指针接收此时p里面存的是str的地址 {*p (char*)malloc(100);//*p得到str让str指向新开辟的空间 } void Test(void) {char* str NULL;GetMemory(str);//传址调用strcpy(str, hello world);printf(str);//释放free(str);str NULL; } int main() {Test();return 0; } 解法二 char* GetMemory() {char* p (char*)malloc(100);//*p得到str让str指向新开辟的空间return p; } void Test(void) {char* str NULL;//GetMemory(str);str GetMemory();strcpy(str, hello world);printf(str);free(str);str NULL; }int main() {Test();return 0; } 还有一种解法可以在数组 p 前面加上 static 来修饰。 hello world 作为字符串常量存储在静态区不会随着 GetMemory 执行结束而销毁。 题目2 char* GetMemory(void) {char p[] hello world;return p; } void Test(void) {char* str NULL;str GetMemory();printf(str); }请问运行Test 函数会有什么样的结果​ 其中最明显的是试图返回一个局部变量的地址。在C语言中当函数执行完毕后其栈上的局部变量会被销毁因此返回局部变量的地址是不安全的。 这里问题的关键在于数组p是一个局部变量在出 GetMemory 函数的时候数组 p 的内存空间就被销毁了还给了操作系统虽然把这个数组首元素的地址返了回去但此时再通过地址去访问这一块空间就成了非法访问。这种问题通常也被叫做返回栈空间地址的问题。 题目3 void GetMemory(char** p, int num) {*p (char*)malloc(num); } void Test(void) {char* str NULL;GetMemory(str, 100);strcpy(str, hello);printf(str); } 请问运行Test 函数会有什么样的结果​  缺少了空间的释放造成了内存泄漏但编译器未发现仍可以执行。 正确的操作应该是在Test结束前应该清空str及其指向的空间所占用的内存防止内存泄漏。 正确做法 void GetMemory(char** p, int num) {*p (char*)malloc(num); } void Test(void) {char* str NULL;GetMemory(str, 100);strcpy(str, hello);printf(str);free(str);str NULL; }int main() {Test();return 0; } 题目4 void Test(void) {char* str (char*)malloc(100);strcpy(str, hello);free(str);if (str ! NULL){strcpy(str, world);printf(str);} }请问运行Test 函数会有什么样的结果​ 这段代码可以成功打印出world。但上面这段代码是有问题的因为free已经把 str 给释放掉了。在 free 完后没有把 str 置为空所以 str 还是指向那块空间此时的 str 已经变成了一个野指针后面一些列涉及 str 的操作都属于非法访问。 正确的做法是在 free 的后面把指针置为空。 正确解法 void Test(void) {char* str (char*)malloc(100);strcpy(str, hello);free(str);str NULL;if (str ! NULL){strcpy(str, world);printf(str);} } 今天就先到这了 看到这里了还不给博主扣个 ⛳️ 点赞☀️收藏 ⭐️ 关注 你们的点赞就是博主更新最大的动力 有问题可以评论或者私信呢秒回哦。

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

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

相关文章

简单的购物网站设计大型免费网页游戏排行榜

SH文件介绍 介绍SH文件示例执行SH文件具体用法 介绍 SH文件通常指的是 Shell 脚本文件,文件后缀名为.sh,其中包含一系列要由操作系统的命令解释器执行的命令。 在 Unix 和类 Unix 操作系统中,通常使用 Bourne Shell(sh&#xff…

博客网站建设源码上海互联网推广找哪家

打卡记录 同积元组&#xff08;哈希表 排列组合&#xff09; 链接 思路&#xff1a;用哈希表将数组中出现的两不同数乘积依次记录&#xff0c;将出现两次以上的乘积组通过排列组合计算总情况个数。 class Solution { public:int tupleSameProduct(vector<int>& num…

分类信息网站如何优化wordpress会员通知插件

一、Array方法 方法参数返回值描述以下Api会修改原属组pushitem1, item2, ...数组新长度向数组的末尾添加一个或多个元素&#xff0c;并返回新的长度pop删除的元素删除数组的最后一个元素&#xff0c;并返回删除的元素unshiftitem1,item2, ...数组新长度向数组的开头添加一个或…

展示型网站一样做seo优化网站维护合同范本

原网址&#xff1a;http://pichcar.iteye.com/blog/676292 URL中的特殊字符 有些符号在URL中是不能直接传递的&#xff0c;如果要在URL中传递这些特殊符号&#xff0c;那么就要使用他们的编码了。编码的格式为&#xff1a;%加字符的ASCII码&#xff0c;即一个百分号%&#xff0…

网站建设和管理是教什么科目成都房地产政策

服务器数据恢复环境&#xff1a; 某单位一台DS5300存储&#xff0c;1个主机4个扩展柜&#xff0c;组建了2组RAID5&#xff08;一组27块硬盘&#xff0c;一组23块盘&#xff09;。27块盘的那组RAID5阵列存放Oracle数据库文件&#xff0c;存储系统一共分了11个卷。 服务器故障&a…

可以做手机网页的网站个人怎么进行网站建设

一、点查看自定义快捷键可以定义一些快速启动方式 然后用不习惯的快捷键也能在这里改 二、android studio 快捷键导出备份 导入方法&#xff1a; android studio &#xff0d;>file->import setting ->选择jar包即可 导出studio的设置方法&#xff1a; android …

AI 编程“效率幻觉”:为何你感觉快了,项目却慢了?

AI 编码工具普及,但为何开发者感觉很快,实际项目却变慢了?本文深入剖析 AI 编程“感知差距”背后的根源,探讨如何通过结构化输入,真正释放 AI 潜能。一、AI 编程的“速度与激情”背后 2025 年,如果你问一个开发者…

lc1033-移动石子直到连续

难度:中等(伪境)题目描述数轴上有三块石子,最左边的石子可以向右移,但不能越过最右边的石子 不能放在有石子的地方最右侧的石子同理 每次只能移动一块石子,在上面规则下不限制距离 问从初始位置到三块石子相邻,…

广东平台网站建设平台小学校园网站建设方案

我的世界换肤教程&#xff0c;本篇教程记录如何使用MCSkin 3D软件、皮肤使用、皮肤预览图制作等相关教程。感兴趣的小伙伴们可以来看看这篇我的世界皮肤教程。一.MCSkin 3D1.4软件介绍及教程&#xff1a;1. 视图-3D设置-屏蔽部位半透明显示在绘制其他部位时&#xff0c;可以用半…

苏州建站公司兴田德润简介呢wordpress 采集发布

大家根据电脑系统的位数&#xff0c;选择 32 位的 VM 配置文件或者 64 位的 VM 配置文件32 位操作系统内存不会超过 4G&#xff0c;所以没有多大空间可以调整&#xff0c;建议不用调整了64 位操作系统中 8G 内存以下的机子或是静态页面开发者是无需修改的。64 位操作系统且内存…

淄博网站制作服务网站名称是什么

人民邮电出版社图灵公司介绍&#xff08;来自http://www.turingbook.com/&#xff09; 北京图灵文化发展有限公司成立于2005年6月&#xff0c;由人民邮电出版社投资控股&#xff0c;以策划出版高质量的科技书籍为核心业务&#xff0c;主要出版领域包括计算机、电子电气、数学统…

滕州网站优化宁波创建网站

一、存储引擎概念介绍 MySQL中的数据用各种不同的技术存储在文件中&#xff0c;每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力&#xff0c;这些不同的技术以及配套的功能在MySQL中称为存储引擎 存储引擎是MySQL将数据存储在文件系统中的存储…

手机网站加速器w7自己做网站

可以以电脑浏览器的手机模式打开&#xff0c;也可以在手机浏览器中直接打开 游戏运用了Canvas的drawImage&#xff0c;translate&#xff0c;rotate&#xff0c;save&#xff0c;restore&#xff0c;fillRect等API。 采用中介者模式&#xff0c;Game类统领全局&#xff0c;负责…

网站研发进度表下载零遁nas做网站

一、环境准备&#xff1a; 1、安装appium 2、xcode (appium 版本&#xff1a;12.1.0 xcode版本&#xff1a;12.5 可正常运行&#xff0c;ps:appium 版本&#xff1a;12.1.0 xcode版本&#xff1a;13.0 一直报奇奇怪怪的错误&#xff09; 3、依赖工具包安装 brew install…

网站建设mvc三层框架图网站模板下载破解版

Transformer模式是Java&#xff08;以及可能仅具有使用场所差异和不变参数类型的其他OO语言&#xff09;的设计模式&#xff0c;可帮助子类型层次结构内的对象将自己流畅地转换为任何类型的对象。 语境 我一直在关注与Jim Laskey发行的JDK-8203703相关的OpenJDK线程&#xff…

专业做网站制作paypal网站做外贸

我发现org.apache.commons.pool非常有用且健壮&#xff0c;但没有充分记录。 因此&#xff0c;我将在这里帮助您解释如何使用Apache KeyedObjectPool 。 什么是KeyedObjectPool &#xff1f; 它是一个映射&#xff0c;其中包含多种类型的实例池。 可以使用任意键访问每种类型。…

大连网站推广爱得科技公司建网站怎么建

Python数据库编程实战&#xff1a;sqlite3模块详解 在Python中&#xff0c;数据库编程是一项重要且实用的技能。通过数据库&#xff0c;我们可以高效地存储、检索和管理大量数据。Python提供了多种数据库编程接口&#xff0c;其中sqlite3模块是一个轻量级的关系型数据库引擎&a…

Modularity —— A thinking to separate complexity

Modularity —— A thinking to separate complexityPosted on 2025-09-22 23:48 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:Modularity —— A thinking to separate complexityModularity —— A thinkin…

同构系统与异构系统深度对比分析

同构系统与异构系统深度对比分析Posted on 2025-09-22 23:48 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:同构系统与异构系统深度对比分析️ 同构系统与异构系统深度对比分析 概述 在分布式系统架构设计中,…

# Redis内存管理与过期策略深度解析

# Redis内存管理与过期策略深度解析Posted on 2025-09-22 23:48 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:# Redis内存管理与过期策略深度解析Redis内存管理与过期策略深度解析 思维路线导读 本文将从Re…