2024-2025-1 20241403《计算机基础与程序设计》第十二周学习总结
作业信息
这个作业属于哪个课程 | <班级的链接>(如2024-2025-1-计算机基础与程序设计) |
---|---|
这个作业要求在哪里 | <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业) |
这个作业的目标 | 指针与一维,二维数组的关系,指针数组及其应用,动态数组,缓冲区溢出攻击 |
作业正文 | https://www.cnblogs.com/chenqiqi/p/18607191 |
教材学习内容总结
一、指针与一维、二维数组的关系
1.二维数组在内存中的存储:二维数组在内存中是按行顺序连续存储的,类似于将二维数组“平铺”开来。
2.指针声明与初始化:可以声明一个指向包含特定数量元素的数组的指针,例如int ()[5],表示指向包含5个int元素的数组的指针。利用数组名作为右值时会转换为指向首行元素的指针这一特性进行赋值。
3.复杂指针表达式分析:例如p + 1会使指针移动到下一行的起始位置,(p + 1)获取第二行数组的首地址,(((p + 1)) + 1)访问第二行的第二个元素。
二、指针数组及其应用
1.指针数组定义:指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块。
2.实现字符串数组:使用指针数组来存储多个字符串,每个字符串的长度可以不同。
3.动态内存分配中的应用:指针数组和数组指针结合使用,灵活高效地管理内存。
三、动态数组
1.动态数组概念:动态数组允许程序在运行时根据需求调整数组大小,通过动态内存分配函数如malloc、calloc、realloc实现。
2.动态数组的创建和管理:介绍了如何使用C语言实现动态数组,包括定义结构体、创建动态数组函数、读取和更新数组元素的函数,以及释放内存。
四、缓冲区溢出攻击
1.缓冲区溢出定义:缓冲区溢出是程序试图将数据写入固定大小的缓冲区时,超出了缓冲区的界限,可能导致程序崩溃或执行恶意代码。
2.缓冲区溢出攻击的影响:攻击者通过输入“超长”的数据,修改程序内的合法数据,比如密码,从而获取操作权。
3.防御策略:介绍了防止缓冲区溢出和注入攻击的策略,强调了在使用C语言时要注意避免这种常见的攻击方式。
教材学习中的问题和解决过程(先问 AI)
问题1:什么时候会有缓冲区溢出?
问题1解决方案:
1.不安全的字符串操作函数使用:
使用如strcpy、strcat、sprintf、gets等不检查目标缓冲区大小的字符串操作函数,容易造成缓冲区溢出。
2.缺乏输入验证:
没有对用户输入或外部数据进行严格的长度和类型检查,导致超出预期的数据长度写入缓冲区。
3.错误的内存管理:
动态分配的内存未及时释放或未按预期使用,导致缓冲区溢出。
4.数组越界访问:
在处理数组时未正确检查索引范围,导致数组越界访问,可能会破坏相邻内存区域。
5.整数溢出与指针算术:
整数溢出发生在整数运算结果超出其数据类型能表示的最大值时,可能导致错误的内存访问。
指针算术错误处理,如不正确的指针加法或减法,也可能导致越界访问,进而引发缓冲区溢出。
6.格式化字符串攻击:
使用printf系列函数时,未正确使用格式字符串,攻击者可以控制格式字符串,导致任意内存读取或写入。
7.动态内存分配不足:
在动态分配内存时,没有为预期的输入分配足够的空间,导致数据超出分配的内存空间。
8.函数返回地址被覆盖:
攻击者通过输入超出缓冲区边界的恶意数据来破坏程序的正常执行流程,覆盖函数返回地址,使程序执行攻击者指定的恶意代码。
9.Unicode溢出:
Unicode溢出通过将Unicode字符插入需要ASCII字符的输入中来创建缓冲区溢出,改变程序的工作方式,出现进一步的安全问题。
问题2:输入多个字符数组时,什么时候要对回车进行处理
问题2解决方案:
1.命令行输入:
在命令行程序中,用户输入命令后通常会按回车键提交命令。在这种情况下,你可能需要从输入中移除回车符,以便正确处理命令。
2.文本编辑:
在文本编辑器中,用户输入的文本可能包含回车符来表示新行。在这种情况下,回车符是文本内容的一部分,不需要从输入中移除。
3.数据解析:
当从文件或网络接收数据并解析成多个字符数组时,如果数据格式中包含换行符作为字段分隔符,那么需要处理回车符以正确分割数据。
4.用户输入验证:
在某些情况下,需要验证用户输入是否符合特定的格式。如果格式要求中不包括回车符,那么在处理输入时需要移除它们。
5.字符串拼接:
如果你正在将多个用户输入的字符串拼接成一个大字符串,并且不希望在拼接的字符串中有额外的换行符,那么需要处理回车符。
6.多行输入:
当程序需要处理多行输入时,回车符通常用来标识一行的结束。在这种情况下,需要保留回车符以正确地识别每一行的开始和结束。
7.文件读取:
在读取文件时,如果文件内容包含多行文本,那么回车符(以及换行符)是区分各行的关键。在这种情况下,需要正确处理回车符以保持文本的结构。
8.跨平台兼容性:
不同操作系统可能使用不同的字符来表示换行(例如,Windows通常使用\r\n,而Unix/Linux使用\n)。在跨平台的应用程序中,可能需要处理这些差异,以确保程序在不同系统上都能正确处理换行。
基于AI的学习
代码调试中的问题和解决过程
- 问题1:在进行字符串比较时直接用<,>,=
- 问题1解决方案:对字符串进行比较应该用strcmp()函数
strcmp(str1,str2)>0表示str1大于str2。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第九周 | 500/4000 | 1/9 | 20/20 | |
第十周 | 500/4500 | 1/10 | 18/38 | |
第十一周 | 500/5000 | 1/11 | 22/60 | |
第十二周 | 500/5500 | 1/12 | 30/90 |