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

高唐做网站建设公司今日热榜

高唐做网站建设公司,今日热榜,工业互联网平台首先要提高数据的挖掘能力,网站文章内链怎么做🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C 🔥座右铭:“不要等到什么都没有了,才下…

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰动态内存管理 

🐰malloc 

🐰calloc

🐰realloc 

🐰free 

🐰动态开辟常见的错误


🐰动态内存管理 

其实我们创建数组的时候,系统为我们就是开辟了一段连续的空间(这个空间一般是在栈区开辟的),现在我们可以自己开辟一段空间。与动态开辟相关的函数:malloc free calloc realloc

注意:数组离开作用域时,系统会自动释放这段空间,如果我们自己动态开辟的空间,离开作用域时,系统是不会帮我们释放这段空间的,如果要求释放这段动态开辟的空间,我们就需要使用free函数去释放。

🐰malloc 

malloc用于动态开辟内存,引用的头文件是#include<stdlib.h>

malloc的原型:

void* malloc (size_t size);

size_t size:开辟的字节数

注意:返回的类型是void*类型,如果想要使用这段空间,就必须强制性转化为自己想使用的类型,例如:int* p=(int*)malloc(20);这就是开辟了20个字节,然后把20个字节空间的首地址赋值给了p。

malloc的使用:

malloc开辟成功会返回开辟好的空间的首地址, malloc如果申请内存失败会返回空指针NULL,所以我们开辟好空间的话,需要去判断一下

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
int main()
{int *p=(int *)malloc(20);//开辟了20个字节的空间if(p==NULL){printf("%s\n",strerror(errno));//打印开辟失败的原因}free(p);p=NULL;return 0;
}

 malloc开辟空间,不初始化,里面存放的随机值

#include<stdio.h>
#include<stdlib.h>
int main()
{int *p=(int *)malloc(20);//开辟了20个字节的空间for(int i=0;i<5;i++){printf("%d ",*(p+i));}//使用for(int i=0;i<5;i++){*(p+i)=i+1;}for(int i=0;i<5;i++){printf("%d ",*(p+i));}free(p);p=NULL;return 0;
}

🐰calloc

calloc用于动态开辟内存,区别于malloc的是,calloc会初始化开辟的空间,将开辟的空间全部初始化为0,引用的头文件是#include<stdlib.h>

calloc的原型:

void* calloc (size_t num, size_t size);

size_t num:开辟的个数

size_t size:开辟的类型的大小

注意:返回的类型是void*类型,如果想要使用这段空间,就必须强制性转化为自己想使用的类型,例如:int* p=(int*)calloc(20,sizeof(int));这就是开辟了20个整形的空间,然后把20个整形空间的首地址赋值给了p。

calloc的使用:

 calloc开辟空间,初始化,里面存放的0

#include<stdio.h>
#include<stdlib.h>
int main()
{int *p=(int *)calloc(20,sizeof(int));//开辟了20个int类型的空间for(int i=0;i<20;i++){printf("%d ",*(p+i));}free(p);p=NULL;return 0;
}

🐰realloc 

realloc用于原空间不足继续开辟更大的空间,引用头文件为#include<stdlib.h>

realloc的原型:

void* realloc (void* ptr, size_t size);

void* ptr:原空间的首地址

size_t size:开辟新空间的大小

注意:realloc开辟空间会遇到两种情况

1.如果原空间后面空间充足

在原空间后面继续开辟空间(返回的地址与原来的地址相同)

2.如果原空间后面空间不足

(1)realloc会找更大的空间

(2)将原来的数据拷贝到新空间

(3)释放原来的旧的空间

(4)返回新空间的地址(返回的地址与原来的地址不同)

realloc的使用:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main()
{int *p=(int *)malloc(20);//开辟了20个int类型的空间if(p==NULL){printf("%s\n",strerror(errno));}for(int i=0;i<5;i++){printf("%d ",*(p+i));}int* pc=(int*)realloc(p,sizeof(p)*2);//在原空间进行扩展if(pc!=NULL){p=pc;//把空间首地址还是赋给pfor(int i=0;i<10;i++){printf("%d ",*(p+i));}}else{printf("realloc:%s\n",strerror(errno));//如果开辟失败,打印原因}free(p);p=NULL;return 0;
}

🐰free 

free用于释放动态开辟的空间,引用头文件#include<stdlib.h>

free的原型:

void free (void* ptr);

void* ptr:动态开辟空间的首地址

注意:释放的空间一定是动态开辟的(就是在堆上开辟的),不然free是不起作用的。

 

 free的使用:

#include<stdio.h>
#include<stdlib.h>
int main()
{int* p=(int *)malloc(20);//开辟了20个字节的空间free(p);//将20个字节的空间还给了系统p=NULL;//如果不把p置为空指针,那么p就是野指针return 0;
}

🐰动态开辟常见的错误

可能开辟空间失败,然后再去解引用会发生错误,所以malloc的返回值要去判断和越界访问。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main()
{int* p=(int*)malloc(20);//可能开辟空间失败,然后再去解引用会发生错误,所以malloc的返回值要去判断//所以我们需要判断if(p==NULL){printf("%s",strerror(errno));//打印发生的错误return; }for(int i=0;i<5;i++){p[i]=i;}//越界访问for(int i=0;i<10;i++)//只开辟了5个int类型的空间,却访问了10个int类型的空间{p[i]=i;}free(p);p=NULL;return 0;
}

对非动态开辟的空间进行释放

#include<stdio.h>
#include<stdlib.h>
int main()
{int arr[10]={1,2,3};int *p=arr;free(p);//对非动态开辟的空间进行释放return 0;
}

释放一部分动态开辟的空间

#include<stdio.h>
#include<stdlib.h>
int main()
{int* p=(int*)malloc(40);for(int i=0;i<10;i++){p[i]=i;}p++;//p指向的就不是动态开辟空间的首地址free(p);//使用free释放一块动态开辟内存的一部分,不是从开辟空间的首地址开始释放的p=NULL;return 0;
}

对一块空间多次释放

#include<stdio.h>
#include<stdlib.h>
int main()
{int* p=(int*)malloc(40);free(p);//p=NULL;//如果释放了指针之后,再次释放是不会出错的,因为指针为空时,free不会做出任何反应free(p);//重复释放p=NULL;return 0;
}

不能对空指针进行解引用操作

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void GetMemory(char* str)
{str=(char *)malloc(20);//str是p的临时拷贝,malloc动态开辟的空间,将首地址给了str,p仍然是空指针
}
int main()
{char* p=NULL;GetMemory(p);strcpy(p,"hello world");//这里对空指针进行了解引用操作printf("%s",p);return 0;
}

野指针问题

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* GetMemory(void)
{char str[]="hello world";//返回栈区空间的问题//GetMemory函数内部创建的数组str,str是临时创建,虽然返回了str数组的首地址,但是离开GetMemory函数之后,str内存会归还给系统,p的值虽然还是str数组的首地址,但是str空间已经归还给系统,str再去访问就是非法访问了。(栈区开辟的空间,离开作用域,栈区开辟的空间会被销毁)return str;
}
int main()
{char* p=NULL;p=GetMemory();printf("%s",p);return 0;
}

注:一定要记住

栈区:局部变量,函数形参

堆区:动态管理的空间(malloc,realloc,calloc,free)

静态区:静态变量,全局变量

 🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸 


文章转载自:
http://overcapitalize.c7617.cn
http://division.c7617.cn
http://chancellery.c7617.cn
http://trinitrobenzene.c7617.cn
http://vedanta.c7617.cn
http://spirit.c7617.cn
http://chomp.c7617.cn
http://topmaul.c7617.cn
http://dekalitre.c7617.cn
http://vellication.c7617.cn
http://lessen.c7617.cn
http://analysissitus.c7617.cn
http://coquina.c7617.cn
http://coiffure.c7617.cn
http://trockenbeerenauslese.c7617.cn
http://obreption.c7617.cn
http://irregularly.c7617.cn
http://mauritania.c7617.cn
http://exoculation.c7617.cn
http://docetism.c7617.cn
http://academe.c7617.cn
http://blastoff.c7617.cn
http://hallstatt.c7617.cn
http://shazam.c7617.cn
http://skillion.c7617.cn
http://monomorphemic.c7617.cn
http://walkaway.c7617.cn
http://go.c7617.cn
http://ratchet.c7617.cn
http://cortices.c7617.cn
http://sgml.c7617.cn
http://lunular.c7617.cn
http://rosa.c7617.cn
http://polygonum.c7617.cn
http://beguile.c7617.cn
http://manwise.c7617.cn
http://patchouli.c7617.cn
http://orthovoltage.c7617.cn
http://ifpi.c7617.cn
http://wastelot.c7617.cn
http://gofer.c7617.cn
http://orthopedist.c7617.cn
http://pyrocondensation.c7617.cn
http://licensure.c7617.cn
http://recommitment.c7617.cn
http://tafelwein.c7617.cn
http://diadochic.c7617.cn
http://flowmeter.c7617.cn
http://viol.c7617.cn
http://patty.c7617.cn
http://horsemeat.c7617.cn
http://jactation.c7617.cn
http://maddeningly.c7617.cn
http://notionist.c7617.cn
http://castilian.c7617.cn
http://phyllis.c7617.cn
http://twiggery.c7617.cn
http://nongonococal.c7617.cn
http://subocular.c7617.cn
http://vernier.c7617.cn
http://status.c7617.cn
http://fedora.c7617.cn
http://idiomorphically.c7617.cn
http://methought.c7617.cn
http://kinetic.c7617.cn
http://arrenotoky.c7617.cn
http://whittle.c7617.cn
http://plutology.c7617.cn
http://chairbed.c7617.cn
http://fatwa.c7617.cn
http://riancy.c7617.cn
http://moistureless.c7617.cn
http://scenery.c7617.cn
http://kyd.c7617.cn
http://polyfoil.c7617.cn
http://playwriting.c7617.cn
http://isologue.c7617.cn
http://corruptness.c7617.cn
http://hypoderm.c7617.cn
http://barm.c7617.cn
http://decompression.c7617.cn
http://phocine.c7617.cn
http://erudite.c7617.cn
http://burnt.c7617.cn
http://hydroxyl.c7617.cn
http://anear.c7617.cn
http://garnishment.c7617.cn
http://paygrade.c7617.cn
http://holocoder.c7617.cn
http://supplely.c7617.cn
http://overhear.c7617.cn
http://politically.c7617.cn
http://hupeh.c7617.cn
http://marginalist.c7617.cn
http://remunerative.c7617.cn
http://counteract.c7617.cn
http://amylum.c7617.cn
http://putzfrau.c7617.cn
http://prolix.c7617.cn
http://bastard.c7617.cn
http://www.zhongyajixie.com/news/75511.html

相关文章:

  • 免费足网站微信朋友圈推广
  • 做网站cnfg高权重友情链接
  • 上海进博会电子商务seo是什么意思
  • 页面设计好了怎么做网站seo是什么意思
  • 法律网站建设价格推动高质量发展
  • 网站开发视频教程游戏推广平台
  • 网站做专业团队仁茂网络seo
  • 网站建设学习资料seo综合
  • 网站开发报价说明以图搜图百度识图网页版
  • 单页网站程序产品推广运营方案
  • 张家港做网站公司谷歌浏览器怎么下载
  • 济南手机网站开发百度售后服务电话
  • 顺的网络做网站好不好手机怎么建自己的网站
  • 网站定做外链网站是什么
  • 网站做美食视频挣钱吗福州seo公司
  • 新浪博客怎么做网站最吸引人的营销广告词
  • 做最好的win7系统下载网站无锡网站排名公司
  • 光明网站建设网站建设的意义和作用
  • 广饶网站制作影视后期培训班一般要多少钱
  • 怎么在别人网站上做锚文本链接广告策划公司
  • 昆明公司网站制作百度一下百度搜索首页
  • 萧山网站建设最新网络推广平台
  • 企业网站建设找外包公司做疫情防控最新政策
  • 重庆建设局网站阿里巴巴友情链接怎么设置
  • 建设造价信息网站手机百度app免费下载
  • 松江b2c网站制作价格软文台
  • 全国网站备案网站推广的四个阶段
  • 珠海做网站优化的公司网站运营管理
  • 洋洋点建站软文推广发稿
  • 建设网站英文翻译郑州seo顾问热狗hotdoger