实验1 网络安全深入C编程

上传人:公**** 文档编号:508286295 上传时间:2023-05-08 格式:DOC 页数:9 大小:68.01KB
返回 下载 相关 举报
实验1 网络安全深入C编程_第1页
第1页 / 共9页
实验1 网络安全深入C编程_第2页
第2页 / 共9页
实验1 网络安全深入C编程_第3页
第3页 / 共9页
实验1 网络安全深入C编程_第4页
第4页 / 共9页
实验1 网络安全深入C编程_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《实验1 网络安全深入C编程》由会员分享,可在线阅读,更多相关《实验1 网络安全深入C编程(9页珍藏版)》请在金锄头文库上搜索。

1、课程名称:计算机网络安全计算机网络安全实验讲稿授课教师:许玉龙适用于计算机应用技术专业课 程 简 介 课程名称:计算机网络安全 课程类别:专业必修课 授课对象:计科专业 学时:54学时(理论36 ,实验18) 学分:3学分 考核方法:课程设计+实验+试卷 使用教材:清华大学出版社网络安全基础应用与标准 先修课程:C/C+程序设计、计算机网络、数据库原理等实验一:深入C/C+编程主 要 内 容一、对内存空间的理解二、函数相关三、对数组的理解四、指针与数组五、结构体一、对内存空间的理解主讲内容:在C 中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编

2、译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。用new或malloc分配内存时,必须要对此指针赋初值。用delete 或free释放内存后,必须要将指针指向NULL不能修改指向常量的指针数据自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前

3、的C语言中,全局变量又分为初始化的和未初始化的,在C 里面没有这个区分了,他们共同占用同一块内存区。 常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多,在const的思考一文中,我给出了6种方法) 首先,我们举一个例子: void f() int* p=new int5; 这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator ne

4、w分配内存,然后返回这块内存的首地址,放入栈中,他在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就会根据相应的Co

5、okie信息去进行释放内存的工作。函数体中的指针或引用常量不能被返回 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 st

6、r 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 b

7、y 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 *

8、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 =

9、 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是指

10、针,它们指向相同的常量区域。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(Mystr2ind

11、ex2=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 ch

12、arlen1;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 Tot

13、alNumber, 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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号