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

dede后台网站地图怎么做设计规范网站

dede后台网站地图怎么做,设计规范网站,相册排版设计,安卓市场下载app导言 在C语言学习阶段#xff0c;指针、结构体和动态内存管理#xff0c;是后期学习数据结构的最重要的三大知识模块#xff0c;也是C语言比较难的知识模块#xff0c;但是“天下无难事”#xff0c;只要认真踏实的学习#xff0c;也能解决#xff0c;所以下文将介绍动态…导言 在C语言学习阶段指针、结构体和动态内存管理是后期学习数据结构的最重要的三大知识模块也是C语言比较难的知识模块但是“天下无难事”只要认真踏实的学习也能解决所以下文将介绍动态内存管理涉及到的一些函数以及概念。 目录 导言 为什么存在动态内存管理 malloc和free malloc free calloc和realloc calloc realloc 常见的关于动态内存管理错误 1.对可能是NULL指针的引用 2.对不是动态开辟的内存进行释放 3.对动态开辟的内存进行越界访问 4.使用free释放动态开辟内存的一部分 5.忘记内存释放忘记free造成内存泄漏 例题 为什么存在动态内存管理 int a; char arr[10]; 这是我们常用的用于向内存申请空间的办法但是 ●空间开辟的空间是固定的 ●数组在申明时数组大小一旦确定申请的内存空间不可变 在实际编写程序时可能我们对于内存空间的需求不是固定那么使用动态内存管理自己申请空间、自己释放空间就是一个很好的选择。 malloc和free malloc 函数参数及其返回值 void* malloc(size_t size); //申请size个字节的空间 //返回值成功申请返回开辟空间的首地址、失败返回NULL 注意点 ●返回值是void*那么我们在实际使用时应把它强制转化为我们需要的类型。 ●与局部变量不同开辟空间在堆区如数组在栈区 ●malloc不会将内存空间初始化为0这是与最大calloc区别 ●动态内存可调整通过realloc 使用举例 free 函数参数及其返回值 void free(void* ptr); //释放动态内存申请的ptr指向的空间 注意点 ●只能用来手动释放动态申请的空间如果不是结果是未定义的 ●释放空间后只是将权限交还于操作系统指针还指向着地址悬空指针应该手动将其置为NULL ●如果释放指针是NULL那么什么也不做。 使用举例 #includestdlib.h int main() {int* ptr NULL;int count 0;scanf(%d, count);ptr (int*)malloc(count * sizeof(int));free(ptr);ptr NULL;return 0; } calloc和realloc calloc 函数参数及其返回值 void* calloc(size_t num,size_t size); //申请num个size个字节的空间并初始化为0 //返回值成功申请返回开辟空间的首地址、失败返回NULL 注意点 ●开辟空间并全部初始化为0 ●两个参数num个size字节 ●其他与malloc类似 使用举例 realloc 函数参数及其返回值 void* realloc(void* ptr,size_t size); //ptr是要调整的内存地址 //size是调整之后的大小 //返回值成功申请返回调整空间的首地址、失败返回NULL 使用举例 #includestdlib.h #includestdio.h int main() {int count;scanf(%d, count);int* ptr (int*)calloc(count, sizeof(int));//申请count个int大小的空间if (ptr) {//判断是不是NULL是否申请成功for (int i 0; i count; i)ptr[i] i;//赋值从0开始到count-1步为1的序列for (int i 0; i count; i)printf(%d , ptr[i]);}printf(\n);printf(调整前的地址%p\n, ptr);//观察动态realloc调整前的地址int* p (int*)realloc(ptr, (count 5) * sizeof(int));//申明一个新指针来接收防止调整失败返回NULL数据丢失调整为多5个int大小的地址if (p)//判断是否是NULL是否调整成功ptr p;printf(调整后的地址%p, ptr);//观察动态realloc调整后的地址free(ptr);ptr NULL;return 0; } 运行结果 先开辟10个int字节大小空间的运行结果 先开辟20个int字节大小空间的运行结果 注意点 ●参数size为0时返回值是NULL并将ptr的内存释放这是未定义的行为在不同的编译器上不能保证 ●如果ptr参数为NULL,会动态开辟一个新的内存空间,此时realloc函数的作用等同于malloc ●这个函数调整空间时会把数据移到新的内存空间内实际上有一种情况不会但是为了代码的健壮性和可移植性我们最好这样定义 两种情况 ①原有地址后面有足够的空间容纳调整后的空间 ②原有地址后面没有足够的空间容纳调整后的空间 其实在前面的使用举例中我们已经观察到 先开辟10个int字节大小空间的运行结果第一种情况 直接在原地址后面开辟新空间 先开辟20个int字节大小空间的运行结果第二种情况 找到一块能容纳调整后的空间的地址将数据移动到其中 关于参数size为0时的举例 因为我们没有办法直接观察一块动态开辟的内存是否被释放且这种size为0行为是未定义的所以我们只能观察它的返回值 关于参数ptr是NULL时的情况 此时realloc等同malloc 注意动态内存管理的4个函数都包含在stdlib.h中 常见的关于动态内存管理错误 1.对可能是NULL指针的引用 2.对不是动态开辟的内存进行释放 // 2.对不是动态开辟的内存进行释放 #includestdio.h #includestdlib.h int main() {int a 0;int* p a;free(p);p NULL;return 0; } 3.对动态开辟的内存进行越界访问 //3.对动态开辟的内存进行越界访问 #includestdlib.h int main() {int* p (int*)malloc(sizeof(int));p;*p 1;free(p);p NULL;return 0; } 4.使用free释放动态开辟内存的一部分 //4.使用free释放动态开辟内存的一部分 #includestdlib.h int main() {int* p (int*)malloc(4*sizeof(int));//动态开辟4个int大小的空间p;//指向第二个元素free(p);p NULL;return 0; } 5.忘记内存释放忘记free造成内存泄漏 //5.忘记内存释放忘记free造成内存泄漏 #includestdlib.h int main() {int* p (int*)malloc(sizeof(int));return 0; } 例题 1. void GetMemory(char* p) {p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(str);strcpy(str, hello world);printf(str); } int main() {Test();return 0; }运行会咋样 p虽然在GetMemory函数中开辟了内存但是在出函数时该地址被销毁所以str还是NULL指针对NULL指针进行赋值是一个未定义行为。传值调用而没有使用传址调用 改正二级指针 void GetMemory(char** p)//使用二级指针接收 {*p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(str);//传入指针的地址strcpy(str, hello world);printf(str); } int main() {Test();return 0; } 改正将开辟的空间返回: 2. char* GetMemory(void) {char p[] hello world;return p; } void Test(void) {char* str NULL;str GetMemory();printf(str); } int main() {Test();return 0; }//运行结果 GetMemory函数返回了一个地址但是这个地址出了函数权限已经收回给了操作系统str接收的是一个野指针并将它打印出来这种行为是未定义的可能造成错误。说到底是栈空间返回会被销毁的问题 我们知道只要是函数内的变量都是栈空间申请的空间在出函数时都会被回收但是动态内存管理申请的空间必须要手动释放所以在函数中我们使用动态内存申请的地址是不会被收回的堆区申请所以我们尝试改正时在函数内部使用动态内存申请并返回。 改正 char* GetMemory(void) {char* p (char*)malloc(20);strcpy(p, hello world!);return p; } void Test(void) {char* str NULL;str GetMemory();printf(str); } int main() {Test();return 0; } 3. //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); } int main() {Test();return 0; }//运行结果以及问题 没释放空间内存泄漏 改正 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(ptr);ptrNULL; } int main() {Test();return 0 } 使用了已经被释放的内存
http://www.hkea.cn/news/14483754/

相关文章:

  • 大连网站开发公司电话上线了怎么做网站
  • php网站建设心得体会域名注册用个人还是公司
  • 找别人做网站要注意什么软件黄页推广引流网站
  • 餐饮网站做的比较好的是哪个建个简单的网站
  • 中国建设银行网站外汇网站开发前后台整个流程
  • 美术馆网站建设方案改变网站字体
  • 网站建设结单 优帮云专业的做pc端网站
  • 高校网站建设 安全教育教务管理系统登录入口
  • 佛山网站哪家最专业服装企业网站内容规划
  • 上海商贸公司企业查询网站排名优化平台
  • 郑州豆芽网站建设珠海特价做网站
  • 网站服务器防火墙设置网站编辑的工作职能有哪些
  • 哪些网站可以做平面设计挣钱自己怎样做网站显示危险
  • 宣传 网站建设方案wordpress文章加密
  • 景区网站如何建设什么是管理
  • 广州在线网站制作最全的百度网盘搜索引擎
  • 外贸网站建设报价高密哪里有做网站的
  • html网页制作代码大全示范十堰网站优化排名
  • 公司展示类网站模板网站后台管理的超链接怎么做
  • 做网站的公司高创做一个天猫店铺要多少钱
  • 浙江省住房和城乡建设厅 官方网站电商网站大连
  • 用别人家网站做跳转如何选择网站建设平台
  • 深圳积分商城网站设计手机一键建站
  • 在线海报设计网站公司网站维护与更新
  • 网站开发模板专家数据库wordpress修改省略图
  • 在哪些网站做收录比较快建设摩托车官网整车验证系统
  • 北京网站制作建设商城网站设计服务
  • asp网站和php网站的区别广告设计公司怎么找业务
  • 镇江网站设计制作北京模板网站开发
  • 网站做广告费用网站建设好的公司哪家好