已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程名称:计算机网络安全计算机网络安全实验讲稿授课教师:许玉龙适用于计算机应用技术专业课 程 简 介 课程名称:计算机网络安全 课程类别:专业必修课 授课对象:计科专业 学时:54学时(理论36 ,实验18) 学分:3学分 考核方法:课程设计+实验+试卷 使用教材:清华大学出版社网络安全基础应用与标准 先修课程:C/C+程序设计、计算机网络、数据库原理等实验一:深入C/C+编程主 要 内 容一、对内存空间的理解二、函数相关三、对数组的理解四、指针与数组五、结构体一、对内存空间的理解主讲内容:在C 中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。用new或malloc分配内存时,必须要对此指针赋初值。用delete 或free释放内存后,必须要将指针指向NULL不能修改指向常量的指针数据自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C 里面没有这个区分了,他们共同占用同一块内存区。 常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多,在const的思考一文中,我给出了6种方法) 首先,我们举一个例子: void f() int* p=new int5; 这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中,他在VC6下的汇编代码如下: 00401028 push 14h 0040102A call operator new (00401060) 0040102F add esp,4 00401032 mov dword ptr ebp-8,eax 00401035 mov eax,dword ptr ebp-8 00401038 mov dword ptr ebp-4,eax 这里,我们为了简单并没有释放内存,那么该怎么去释放呢?是delete p么?澳,错了,应该是delete p,这是为了告诉编译器:我删除的是一个数组,VC6就会根据相应的Cookie信息去进行释放内存的工作。函数体中的指针或引用常量不能被返回 Char *func(void)char str=”Hello Word”;/这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉return str; 函数体内的指针变量并不会随着函数的消亡而自动释放问题:栈内存使用下面程序运行有什么问题?char* GetString(void)char p = hello world;return p;/ 编译器将提出警告void Test4(void)char *str = NULL;str = GetString();/ str 的内容是垃圾cout str endl;答案与分析:返回栈内存,内存可能被销毁,也可能不被销毁,但是,出了作用域之后已被标记成可被系统使用,所以,乱七八糟不可知内容,当然,返回的指针的内容,应该是不变的,特殊时候是有用的,比如,可以用来探测系统内存分配规律等等。二、函数相关 C+函数中值的传递方式有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference)void fun(char c) /pass by valuevoid fun(char *str) /pass by pointervoid fun(char &str) /pass by reference如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构函数的返回类型不能省略,就算没有也要加个void三、对数组的理解/数组char a=”Hello Word!”;char b10;strcpy(b,a);if (strcmp(a,b)=0)/指针char a=”Hello Word!”;char *p;p=new charstrlen(a)+1;strcpy(p,a);if (strcmp(p,a)=0)四、指针与数组记住一点,C无法知道指针所指对象的大小,指针的大小永远为4字节 char a=”Hello World!”char *p=a;countsizeof(a)end; /12字节countsizeof(p)endl; /4字节而且,在函数中,数组参数退化为指针,所以下面的内容永远输出为4 void fun(char a1000)countsizeof(a)endl; /输出4而不是1000附例1:思考:int main() char a=hello;char *p=hello;int k=strcmp(a,p); coutk endl; /0;a中的字符串与p指向的字符串相同,返回0cout(a = = p)endl;/0;表示a的地址与p的地址不相同,返回0char str1 = abc;char str2 = abc;char *str3 = abc;char *str4 = abc;cout ( str1 = = str2 ) endl;/0;表示str1的地址与str2的地址不同,返回0cout ( str1 = = str3 ) endl;/0;表示str1的地址与str3指向内容不同,返回0cout ( str3 = = str4 ) endl;/1;表示str3指向内容与str4指向内容相同,返回1cout ( str2 = = str4 ) endl;/0;表示str2地址与str4指向内容不同,返回0/ str1,str2是数组变量,它们有各自的内存空间;/而,str3,str4是指针,它们指向相同的常量区域。return 0;附例子2.1:/*删除指定字符常规的解法int main()char Mystr1=she is our teacher!;char Mystr2=shr; int ktt=0; int len1=strlen(Mystr1)+1; int len2=strlen(Mystr2)+1; char *final = new charlen1;memset(final,0,len1);for(int index2=0;index2len2;index2+)for(int index1=0;index1len1;index1+) if(Mystr2index2=Mystr1index1) Mystr1index1=0;for(int index1=0;index1len1;index1+)if(0!=Mystr1index1)finalktt+=Mystr1index1; printf(%s,final);return 0;例2.2 :/*利用字符存储性质,高效率删除指定字符*/int main()char str1=she is our teacher!;char str2=shr; int i,j,k=0; int len1=strlen(str1); int len2=strlen(str2); char *final = new charlen1;memset(final,0,len1);char temp 256;for (i=0;ilen2;i+)tempstr2i=1;for (j=0;jlen1;j+)if(1!=tempstr1j)finalk+ =str1j;cout高效率地在字符串中删除指定的字符nendl;printf(删除前源字符串str1是: %sn,str1);printf(要删除的字符str2 是: %sn,str2);printf(str1删除后的字符串是 : %sn,final);delete final;return 0;例3:./经典约瑟夫环用数组实现方法一int main()int TotalNumber, SetNumber;int k=0,OutNumber=0;int i;int *a;coutTotalNumber;coutSetNumber;if (SetNumberTotalNumber) return 1;/a=new intTotalNumber; /C+内存申请方法a=(int*)malloc(sizeof(int)*TotalNumber); /C内存申请方法 for (i=0;iTotalNumber;i+) ai=i+1;cout出圈的序列是:;while (OutNumberTotalNumber)for (i=0;iTotalNumber;i+)if (ai!=0) k+; if(k=SetNumber) coutai; ai=0; k=0; OutNumber+; coutendl; return 0; void fun2()/经典约瑟夫环用数组实现方法二,模运算实现,提高效率int TotalNumber, SetNumber;int countNum=0,OutNumber=0;int i;int *a;cout方法2:endl;coutTotalNumber;coutSetNumber;if (SetNumberTotalNumber) return ;a=new intTotalNumber; /C+内存申请方法/a=(int*)malloc(sizeof(int)*TotalNumber); /C内存申请方法 for (i=0;iTotalNumber;i+) ai=i+1;cout方法2出圈的序列是:;for (int j=0;j+)int temp=j%TotalNumber;if (atemp!=0)countNum+;if(countNum=SetNumber) coutatemp; atemp=0; countNum=0; OutNumber+; if(OutNumber=TotalNumber) break; coutendl;delete a;附例4: 不使用额外的空间,来交换两个变量的值?方法1, swap(int a , int b) / 假如a=9,b=5; a=a+b; / 此时a=14b=a-b; / 此时a=9 a=a-b; / 此时a=5 方法2: Swap(int a, int b) / 假如 a=9, 二进制位1001; b=5, 二进制为0101; a = ab; / 此时 a=12, 二进制1100; b = ab; / 此时 a=9, 二进制1001; a = ab; / 此时 a=5,二进制0101;五、结构体与类 结构体与类的相同和不同练习思考题:腾讯面试题回答下面的问题(6分)(1).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 函数会有什么样的结果?答:输出“hello”(2). void Test(void)char *str = (char *) malloc(100);strcpy(str, “hello”);free(str);if(str != NULL)strcpy(str, “world”);printf(str);请问运行Test 函数会有什么样的结果?答:输出“world”(3). char *GetMemory(void)char p = hello world;return p;void Test(void)char *str = NULL;str = GetMemory();printf(str);(4),请问运行Test 函数会有什么样的结果?答:无效的指针,输出不确定(5). 编写strcat函数已知strcat函数的原型是char *strcat (char *strDest, const char *strSrc);其中strDest 是目的字符串,strSrc 是源字符串。(6),不调用C+/C 的字符串库函数,请编写函数 strcat答:VC源码:char * _cdecl strcat (char * dst, const char * src)char
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年激光雷达于自动驾驶辅助创新报告
- 布氏杆菌病患者的活动与康复护理
- 云南精美介绍
- 2026年量子计算技术突破创新报告及信息技术革命分析报告
- 2025年特色农产品冷链仓储技术创新在食品安全中的应用可行性报告
- 仓库收发存管理制度
- 机动车尾气控制技术展望
- 国家知识产权局专利局专利审查协作江苏中心2026年度专利审查员公开招聘备考题库及1套参考答案详解
- 中国民用航空局审计中心2026年度公开招聘工作人员备考题库及一套完整答案详解
- 2026年浙江泰隆商业银行社会招聘备考题库及参考答案详解一套
- GA/T 751-2024公安视频图像屏幕显示信息叠加规范
- 民政局笔试题及答案
- 二零二五版中医师承关系合同书
- 个人护理健康知识与技巧
- 《微积分与线性代数》课件
- 锅炉三大安全附件69课件讲解
- (湘美版)五年级上册书法指导练习教案
- 家具回收合同模板
- 学习方法总结高效学习的技巧与方法
- 综合医院心身疾病诊治
- 港口安全生产管理模版
评论
0/150
提交评论