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

阿里百川 网站开发网站建设后需要交费吗

阿里百川 网站开发,网站建设后需要交费吗,怎样学装修设计快速入门,专业做包装设计网站动态内存管理 #x1f388;1.为什么存在动态内存分配#x1f388;2.动态内存函数的介绍#x1f52d;2.1malloc和free函数#x1f52d;2.2calloc函数#x1f52d;2.3realloc函数 #x1f388;3.常见的动态内存错误#x1f52d;3.1对NULL指针的解引用操作#x1f52d;3.2… 动态内存管理 1.为什么存在动态内存分配2.动态内存函数的介绍2.1malloc和free函数2.2calloc函数2.3realloc函数 3.常见的动态内存错误3.1对NULL指针的解引用操作3.2对动态开辟空间的越界访问3.3对非动态开辟空间内存使用free释放3.4使用free释放一块动态开辟内存的一部分3.5对同一块动态内存多次释放3.6动态开辟内存忘记释放内存泄漏 4.几个经典的笔试题4.1题目一4.2题目二4.3题目三4.4题目四 5.C/C程序的内存开辟6.使用动态内存相关的知识改进通讯录 1.为什么存在动态内存分配 ✅截止目前我们掌握的内存开辟的方式有 int a 10;//在栈空间上开辟4个字节char arr[10] { 0 };//在栈空间上开辟10个字节的连续空间但是上述的开辟空间的方式有两个特点 空间开辟的大小是固定的。数组在申明的时候必须指定数组的长度它所需的内存在编译时分配。 但是对于空间的需求不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道那数组的编译时开辟空间的方式就不能满足了。这个时候我们就只能试试动态存开辟 2.动态内存函数的介绍 2.1malloc和free函数 C语言提供了一个动态开辟内存的函数 void *malloc(size_t size);✅这个函数向内存申请一块连续可用的空间并返回这块空间的指针。 如果开辟成功则返回一个指向开辟好空间的指针。如果开辟失败则返回一个NULL指针因此malloc的返回值一定要做检查。返回值的类型是void*,所以malloc函数并不知道开辟空间的类型具体在使用的时候使用者来决定。如果参数size为0malloc的行为是标准是未定义的取决于编译器。 int main() {//申请一块空间用来存放10个整型int* p (int*)malloc(10 * sizeof(int));return 0; }✅内存的存储 注意 malloc和free都声明在stdlib.h的头文件中。 ✅运行示例 #include stdio.h #include stdlib.h int main() {//申请一块空间用来存放10个整型int* p (int*)malloc(10 * sizeof(int));if (p NULL){perror(malloc);return 1;}//使用int i 0;for (i 0; i 10; i){*(p i) i;}for (i 0; i 10; i){printf(%d , p[i]);}return 0; }C语言提供了另外一个函数free,专门用来做动态内存的释放和回收 void free(void *ptr);free函数用来释放动态开辟的内存。 如果参数ptr指向的空间不是动态开辟的则free函数的行为是未定义的。如果参数ptr是NULL指针则函数什么事都不做。 malloc函数申请的空间是怎么释放的呢 free释放-主动释放程序退出后malloc申请的空间也会被操作系统回收。-被动回收 free(ptr);//释放ptr所指向的动态内存 ptr NULL;2.2calloc函数 malloc和calloc函数除了参数的区别calloc函数申请好空间后会将空间初始化0但是malloc函数不会初始化。 2.3realloc函数 ✅该函数用于对我们已开辟动态空间大小的调整 #include stdio.h #include stdlib.h int main() {//申请一块空间用来存放10个整型int* p (int*)malloc(10 * sizeof(int));if (p NULL){perror(malloc);return 1;}//使用int i 0;for (i 0; i 10; i){*(p i) i;}//打印for (i 0; i 10; i){printf(%d , p[i]);}//空间不够希望调整空间为20个整型的空间realloc(p, 20 * sizeof(int));//释放free(p);p NULL;return 0; }但是这种方法是有问题的因为realloc开辟空间也可能会失败失败的时候返回NULL!因此如果这个时候我们还用p来接收的话那么我们原来有的10个字节的空间可能也丢失了。 //更改: //空间不够希望调整空间为20个整型的空间int* ptr (int*)realloc(p, 20 * sizeof(int));if (ptr ! NULL){p ptr;}✅realloc函数是如何工作的呢 要扩展的内存就直接在原有内存之后追加空间原来空间的数据不发生变化。原有空间之后没有足够多的空间扩展的方法就是在堆空间上另找一个合适大小的连续空间来使用。这样函数返回的是一个新的内存空间。 3.常见的动态内存错误 3.1对NULL指针的解引用操作 void test() {int* p (int*)malloc(INT_MAX / 4);*p 20;//如果p的值是NULL就会有问题free(p); }3.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); }3.3对非动态开辟空间内存使用free释放 void test() {int a 10;int* p a;free(p);//no }3.4使用free释放一块动态开辟内存的一部分 void test() {int* p (int*)malloc(100);p;free(p);//p不再指向动态内存的起始位置 }3.5对同一块动态内存多次释放 void test() {int* p (int*)malloc(100);free(p);free(p);//重复释放 }3.6动态开辟内存忘记释放内存泄漏 void test() {int* p (int*)malloc(100);if (NULL ! p){*p 20;} } int main() {test();while (1); }❗**注**动态开辟的空间一定要释放并且正确释放。 4.几个经典的笔试题 4.1题目一 void GetMemory(char* p) {p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(str);strcpy(str, hello world);printf(str); }请问运行Test函数会有什么样的结果 //当程序对NULL的进行解引用操作的时候程序崩溃后序代码也不会执行。 strcpy(str, hello world);//同时malloc开辟的空间没有释放内存会泄露 p (char*)malloc(100);//更正 #include stdio.h #include stdlib.h void GetMemory(char** p) {*p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(str);strcpy(str, hello world);printf(str);free(str);str NULL; } int main() {Test();return 0; }✅运行 //更正二 #include stdio.h #include stdlib.h char* GetMemory() {char *p (char*)malloc(100);return p; } void Test(void) {char* str NULL;str GetMemory();strcpy(str, hello world);printf(str);free(str);str NULL; } int main() {Test();return 0; }4.2题目二 #include stdio.h #include stdlib.h char* GetMemory(void) {char p[] hello world;return p; } void Test(void) {char* str NULL;str GetMemory();printf(str); } int main() {Test();return 0; }请问运行Test函数会有什么样的结果 str GetMemory();//返回栈空间地址的问题野指针✅可以这样进行修改 4.3题目三 #include stdio.h #include stdlib.h 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; }请问运行Test函数会有什么样的结果 *p (char*)malloc(num);//malloc申请的空间没有释放//更正 #include stdio.h #include stdlib.h 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.4题目四 #include stdio.h #include stdlib.h void Test(void) {char* str (char*)malloc(100);strcpy(str, hello);free(str);if (str ! NULL){strcpy(str, world);printf(str);} } int main() {Test();return 0; }请问运行Test函数会有什么样的结果 strcpy(str, world);//非法访问内存的情况str为野指针 5.C/C程序的内存开辟 C/C程序内存分配的几个区域 栈区stack在执行函数时函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中效率很高但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。堆区heap一般由程序员分配释放 若程序员不释放程序结束时可能由OS回收 。分配方式类似于链表。数据段静态区static存放全局变量、静态数据。程序结束后由系统释放。代码段存放函数体类成员函数和全局函数的二进制代码。 6.使用动态内存相关的知识改进通讯录 通讯录刚开始时可以存放3个人的信息。空间如果放满每次可以增加2个信息的空间。 contact.h #pragma once //类型的声明 #include stdio.h #include assert.h #include string.h #include stdlib.h #define Max 100 #define NAME_MAX 10 #define DEFAULT_SZ 3 typedef struct PepInfo {char name[NAME_MAX];int age;char sex[5];char tele[12];char addr[20]; }PInfo;//静态通讯录 //typedef struct Contact //{ // PInfo data[Max]; // int sz;//用于记录当前通讯录中存放了多少个人的信息 //}Contact;//动态通讯录的版本 typedef struct Contact {PInfo* data;//存放数据int sz;//记录当前通讯录中存放的人的信息的个数int capacity;//记录通讯录的容量 }Contact;//初始化通讯录 void InitContact(Contact* c);//增加联系人 void AddContact(Contact* c);//删除指定的联系人 void DelContact(Contact* c);//查找指定的联系人 void SearchContact(Contact* c);//修改指定联系人 void ModifyContact(Contact* c);//按照年龄排序 void AgeSortContact(Contact* c);//销毁通讯录 void DestroyContact(Contact *c);contact.c #define _CRT_SECURE_NO_WARNINGS 1 #include contact.h //静态的版本 //void InitContact(Contact *c) //{ // assert(c); // c-sz 0; // memset(c-data, 0, sizeof(c-data)); //}void InitContact(Contact* c) {assert(c);c-sz 0;c-capacity DEFAULT_SZ;c-data calloc(c-capacity, sizeof(PInfo));if (c-data NULL){perror(InitContact-calloc);return;} }//增容的函数可以单独封装 void CheckCapacity(Contact* c) {if (c-sz c-capacity){PInfo* ptr (PInfo*)realloc(c-data, (c-capacity 2) * sizeof(PInfo));if (ptr ! NULL){c-data ptr;c-capacity 2;printf(增容成功\n);}else{perror(AddContact-realloc);return;}} }//销毁通讯录 void DestroyContact(Contact* c) {free(c-data);c-data NULL;c-sz 0;c-capacity 0; }void AddContact(Contact* c) {//首先要判断该通讯录是否已经满了assert(c);//增加容量CheckCapacity(c);if (c-sz Max){printf(通讯录已满无法增加\n);return;}printf(请输入姓名);scanf(%s, c-data[c-sz].name);printf(请输入年龄);scanf(%d, c-data[c-sz].age);printf(请输入性别);scanf(%s, c-data[c-sz].sex);printf(请输入电话);scanf(%s, c-data[c-sz].tele);printf(请输入地址);scanf(%s, c-data[c-sz].addr);c-sz;printf(增加成功\n); }void ShowContact(const Contact* c) {assert(c);if (c-sz 0){printf(通讯录为空无需打印\n);}int i 0;printf(%-20s%-5s%-5s%-12s%-30s\n, 姓名, 年龄, 性别, 电话, 地址);for (int i 0; i c-sz; i){printf(%-20s%-5d%-5s%-12s%-30s\n,c-data[i].name, c-data[i].age, c-data[i].sex, c-data[i].tele, c-data[i].addr);} }int FindByName(Contact* c, char name[]) {assert(c);int i 0;for (i 0; i c-sz; i){if (strcmp(c-data[i].name, name) 0){return i;}}return -1;//找不到 }void DelContact(Contact* c) {char name[NAME_MAX];assert(c);if (c-sz 0){printf(通讯录为空无法删除\n);return;}printf(输入要删除人的姓名);scanf(%s, name);//找到姓名为name的人int ret FindByName(c, name);if (ret -1){printf(要删除的人不存在\n);return;}//删除这个人int i 0;for (i ret; i c-sz - 1; i){c-data[i] c-data[i 1];}c-sz--;printf(删除成功\n); }void SearchContact(Contact* c) {char name[NAME_MAX];assert(c);printf(请输入要查找人的姓名);scanf(%s, name);int ret FindByName(c, name);if (ret -1){printf(要查找的人不存在\n);return;}//若找到了打印出相关信息printf(%-20s%-5s%-5s%-12s%-30s\n, 姓名, 年龄, 性别, 电话, 地址);printf(%-20s%-5d%-5s%-12s%-30s\n,c-data[ret].name, c-data[ret].age, c-data[ret].sex, c-data[ret].tele, c-data[ret].addr); }void ModifyContact(Contact* c) {char name[NAME_MAX];assert(c);printf(请输入要修改人的姓名);scanf(%s, name);int ret FindByName(c, name);if (ret -1){printf(要修改的人不存在\n);return;}//修改printf(请输入姓名);scanf(%s, c-data[ret].name);printf(请输入年龄);scanf(%d, c-data[ret].age);printf(请输入性别);scanf(%s, c-data[ret].sex);printf(请输入电话);scanf(%s, c-data[ret].tele);printf(请输入地址);scanf(%s, c-data[ret].addr);printf(修改成功\n); }int cmp(const void *a,const void *b) {return strcmp((*(PInfo*)a).age, (*(PInfo*)b).age); }void AgeSortContact(Contact* c) {assert(c);qsort(c-data, c-sz, sizeof(PInfo), cmp);printf(%-20s%-5s%-5s%-12s%-30s\n, 姓名, 年龄, 性别, 电话, 地址);for (int i 0; i c-sz; i){printf(%-20s%-5d%-5s%-12s%-30s\n,c-data[i].name, c-data[i].age, c-data[i].sex, c-data[i].tele, c-data[i].addr);} }test.c //文件用于测试通讯录的基本功能。 #define _CRT_SECURE_NO_WARNINGS 1 #include contact.h//自己定义的头文件用 void menu() {printf(***********************************\n);printf(********1.增加联系人***************\n);printf( \n);printf(********2.删除指定联系人的信息*****\n);printf( \n);printf(********3.查找指定联系人的信息*****\n);printf( \n);printf(********4.修改指定联系人的信息*****\n);printf( \n);printf(********5.排序通讯录的信息*********\n);printf( \n);printf(********6.显示所有联系人的信息*****\n);printf( \n);printf(********0.退出程序*****************\n);printf(***********************************\n); } enum Option {EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT }; int main() {int input 0;Contact con;//初始化函数InitContact(con);do{menu();printf(请输入你的选择);scanf(%d, input);switch (input){case ADD:AddContact(con);system(pause);system(cls);break;case DEL:DelContact(con);system(pause);system(cls);break;case SEARCH:SearchContact(con);system(pause);system(cls);break;case MODIFY:ModifyContact(con);system(pause);system(cls);break;case SHOW:ShowContact(con);system(pause);system(cls);break;case SORT:AgeSortContact(con);system(pause);system(cls);break;case EXIT:DestroyContact(con);printf(退出通讯录\n);break;default:break;}} while (input);return 0; }好啦关于动态内存管理的知识到这里就先结束啦后期会继续更新学习C语言的相关知识欢迎大家持续关注、点赞和评论❤️❤️❤️
http://www.zqtcl.cn/news/935526/

相关文章:

  • 手机可以建立网站吗自己造网站
  • 厦门建网站哪家好手机编程网站
  • 网站搭建后台奥门网站建设
  • 电子商务网站免费模板展示型网站与营销型网站
  • 除了红动中国还有哪些设计网站宁波建网站哪家
  • 网站的建设费用预算策划书wdcp网站备份
  • 济南制作公司网站网站设计的实例
  • 网站建设需要的文案一个网站的后台怎么做
  • 电影网站建设模板营销方式都有哪些
  • 书店商城网站建设方案未央免费做网站
  • 北京房产网北京二手房企业网站seo方案案例
  • 大连品牌官网建站二级建造师最好的网站
  • python开发工具搜索引擎优化的英语简称
  • 做产品代理上哪个网站好东莞公司网上推广
  • 专业制作网站公司上海广告公司联系方式
  • 古交市网站建设公司四川省建设厅电子政务网站
  • 清河网站建设费用50万做网站
  • 怎么找网站的根目录平台类网站营销方案
  • 网站关键词 价格生成山西建设工程备案网站
  • 网站开发入哪个会计科目设计师自己的网站
  • php做网站界面代码定制网页设计报价
  • 重庆智能模板建站wordpress+widget+开发
  • vps网站空间时尚网站首页设计
  • 美容行业网站建设方案网站建设需求背景
  • 贵阳做网站找哪家好长沙部分风险区域调整
  • 设计网站 常用微信网站建设口碑好
  • 网站建设加盟列举网络推广的方式
  • 大连博硕网站建设dw做网站背景音乐
  • 江苏省建设执业网站北京做胃镜哪好德胜门网站I
  • 南京网站开发南京乐识好郑州宣传片制作多少钱