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

做网站开发有前途么免费php企业网站管理系统

做网站开发有前途么,免费php企业网站管理系统,保定网站建设公司哪家好,自助分红网站建设文章目录 前言练习1:练习2:练习3:练习4: 前言 学习完C语言中的动态内存管理,大家开始利用动态内存管理来去开辟空间,经过一顿狂敲代码后,发现了问题,程序要么崩掉,要么运…

在这里插入图片描述

文章目录

  • 前言
  • 练习1:
  • 练习2:
  • 练习3:
  • 练习4:

前言

学习完C语言中的动态内存管理,大家开始利用动态内存管理来去开辟空间,经过一顿狂敲代码后,发现了问题,程序要么崩掉,要么运行不起来。小编现在给大家分享动态内存中常见的练习,如有谬误,欢迎指正

请添加图片描述

练习1:

void GetMemory(char* p)
{p = (char*)malloc(100);
}
void Test(void)
{char* str = NULL;GetMemory(str);strcpy(str, "hello world");printf(str);
}

运⾏Test 函数会有什么样的结果?

敲完代码,运行一下,程序崩掉啦。这里的GetMemory()函数,采用的是值传递,形参是实参的一份临时拷贝。p和str是各自独立的两个指针,GetMemory()函数让p开辟了一个内存空间。但是(重点),p的值最初是在str中拷贝的,拷贝完之后,两个指针没有任何关系。当GetMemory()函数结束后,p的内存就被释放掉了,然后执行srecpy(),此时str仍然是一个空指针,这个程序也就无法被访问。

还有一个问题是,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;
}

运行结果

hello world

这个问题,在日后会经常遇到,需要留意一下。

练习2:

char* GetMemory(void)
{char p[] = "hello world";return p;
}
void Test(void)
{char* str = NULL;str = GetMemory();printf(str);
}

运⾏会有什么样的结果?
数组p是一个局部变量

在 GetMemory 函数之后,数组 p 的内存空间就被销毁了,还给了操作系统,虽然把这个数组首元素的地址返了回去,但此时再通过地址去访问这一块空间,就成了非法访问。

修改后的代码

char* GetMemory(void)
{char* p = "hello world";return p;
}
void Test(void)
{char* str = NULL;str = GetMemory();printf(str);
}int main()
{Test();return 0;
}

运行结果

hello world

练习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);
}

运行结果

hello world

这段代码运行后发现是可以的,但是看到了malloc却看不到free,存在内存泄漏问题

修改后的代码

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);
}
}

运⾏会有什么样的结果?

world

代码也是可以运行的

但是依然有错

因为早在开始,就把str给释放了,这块内存权限给了操作系统

在 free 完后没有把 str 置为空,所以 str 还是指向那块空间,此时的 str 已经变成了一个野指针,后面一些列涉及 str 的操作都属于非法访问。

修改后的代码

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.yayakq.cn/news/951755/

相关文章:

  • wordpress多站点必备插件可以在手机上编程的软件
  • 婚恋网站设计网站建设用哪种语言
  • wordpress ajax请求seo优化推广技巧
  • 电商网站 网站服务内容WordPress移动端加搜索框
  • 线上购物网站建设的可行性模板简历
  • 西安 做网站pc网站建设怎么做
  • 网站开发培训光山个人网站的设计与实现的任务书
  • 公司做网站公司展示型网站包含哪些模块
  • 电商型企业网站建设电商网
  • 做视频网站带宽不够怎么办优化网站的目的
  • 入侵网站做360广告东莞企业如何建网站
  • 宁波网站制作 收费标准博客html模板
  • 太原网站公司哪家好网站二次开发是什么意思
  • 网站后台英语苏州建设集团
  • 湖北网站设计制作多少钱wordpress文章数据下载
  • 怎么创建自己的网站平台设计分享网站
  • 档案网站建设网页蚌埠网站建设专业公司
  • 淮安市建设工程安全监督站网站各类网站建设
  • 网站推广的基本方法对于大部分网站来说都是适用的兰州优化网站公司
  • 网站开发成功案例网站英文版是怎么做的
  • 网站 301帷客分享 wordpress
  • 做食品网站需要什么条件广州建设大马路小学网站
  • 南京旅游网站建设公司做网站可以卖钱吗
  • 在制作网站前 不需要急于做的工作是开通一个微信小程序
  • 电子商务网站是电子商务企业wordpress如何发照片
  • 网站建设需要什么流程wordpress的title怎么书写
  • 行业网站建设收费明细保定做网站百度推广
  • 企业网站建立流程的第一步是如何把物流做免费网站
  • 松江新城投资建设发展有限公司网站如何做网站的源码
  • 湘潭做网站 i磐石网络自己建一个网站需要准备什么