公开课学习笔记- 哈佛 计算机科学CS50(五)

本文深入探讨了C语言中的内存管理技巧,包括使用realloc()动态调整内存大小,以及如何安全地处理敏感数据,避免缓冲区溢出攻击。同时,讲解了自定义数据类型、文件读写操作和单链表的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

               

第11课 内存、头文件和数据结构 - 2011.10.30

对于C语言,内存分配是非常重要的,这涉及到程序的稳定性和安全性。假设有在stack中存储username和pw这样安全敏感的数据,有风险,因为函数返回时,这些内容并没有真正消失,如果是我们自己的程序,确保只有我们自己的代码访问内存没有问题,但是如果是合作性的或者是库方式,有buffer overflow exploit的隐患。例如,通过memcpy覆盖函数的返回地址(存放在stack),可以跳到hacker代码的入口。因此我们要注意检测数据的边界,不允许越界处理,另外这类数据可采用heap的存放方式,自主控制分配和释放(stack的是由系统自动进行)。此外我们要避免将某些敏感数值,例如pw写死,作为initialized data,相对地址和数值固定不变,存在风险,可以通过gdb或者某些方式来获取。在java,不会出现这种情况,所有内存分配和释放都是系统进行。

有一个以前没用过的空间分配函数 realloc(),就是重新分配的意思,可以用了扩大内存大小,而不影响原有的数据。realloc实际调用malloc,并将原来的内容memcopy过来,free原来的内容。

接着介绍了头文件,自定义数据类型和文件读写。

第12课 内存,文件存放,链表 -2011.10.31

sscanf,语法和printf相似,但是不是写,而是从中读取。例如sscanf(line," %d %c",&n,&c);则根据格式,将line的相应内容读入n和c中,返回读取的内容,如果line="123",则只能读取%d到n,1个数据,返回1,如果line"123X",则读取两个数据,返回2。scanf是从keyborad中读取,同理。

介绍数组。数组预先限定大小,允许分配某个固定值,都可能产生越界。采用realloc可以解决,但是效率较低。接着介绍单链表。

typedef struct node{
    int n;
    struct node * next;
}t_node;

文件存放采用类似的方式,通过增加block来增加存储空间。利用此,我们可以获取或猜测已删除文件的的地址,并进行恢复。例如加入一个文件,可以从文件读取前前面地址存放的数据。具体和disk文件架构相关。

介绍单链表的增、删处理。

相关链接:我的与编程思想相关的文章

           

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

<think>嗯,用户问的是零基础如何从零开始学习计算机。首先,我需要考虑用户可能的背景。零基础可能意味着他们对计算机的了解非常有限,甚至可能没有接触过编程或者计算机科学的基本概念。因此,我应该从最基础的部分开始,逐步引导他们建立知识体系。 接下来,我需要确定学习路径的结构。通常,计算机科学的学习可以分为几个阶段:基础知识、编程入门、核心领域、工具和环境、项目实践、持续学习。这样的结构可以帮助用户分步骤学习,不会感到太吃力。 基础知识部分,应该包括计算机的组成、操作系统的基本使用,以及网络基础。比如,解释什么是CPU、内存、硬盘,以及如何安装软件和管理文件。这些内容对于完全零基础的人来说是必要的,因为他们可能对这些概念一无所知。 然后是编程入门。选择一门适合初学者的语言很重要,Python通常是一个不错的选择,因为它语法简洁,应用广泛。需要指导用户学习基本语法、数据类型、流程控制,然后逐步过渡到函数和模块。同时,强调练习的重要性,比如通过在线平台做题,或者自己尝试解决实际问题。 核心领域方面,可能需要介绍数据结构与算法、计算机组成原理、操作系统、计算机网络、数据库等。但这里要注意深度,零基础的人可能无法一下子掌握这么多内容,所以需要分阶段,可能先重点在数据结构和算法,因为这对编程能力提升最直接。 工具和环境部分,版本控制工具如Git是必须的,开发环境如VS Code或PyCharm也需要介绍。此外,命令行操作也是基础技能之一,应该让用户熟悉基本的命令。 项目实践是关键,因为只有通过实际项目,用户才能巩固所学知识。需要建议他们从小项目开始,逐步增加复杂度,并参与开源项目或团队协作,这有助于学习协作开发和代码管理。 持续学习方面,推荐优质资源如在线课程、书籍、技术社区等。同时,提醒用户保持好奇心和耐心,因为学习计算机可能会遇到很多困难,需要坚持不懈。 最后,需要注意用户的潜在需求。他们可能想转行进入IT行业,或者只是对计算机感兴趣。因此,在回答中应该鼓励他们设定目标,并持之以恒。同时,强调实践的重要性,避免只停留在理论层面。 可能还需要调整语言,避免使用过于专业的术语,用更通俗易懂的例子来解释概念。例如,用“计算机的大脑”来比喻CPU,帮助用户理解。此外,提醒用户不要急于求成,学习是一个渐进的过程,每一步都需要打好基础。 总结一下,回答的结构应该是分步骤、循序渐进,涵盖基础到进阶,强调实践和资源推荐,同时给予鼓励和支持,帮助用户建立信心。</think>零基础学习计算机可以遵循以下结构化路径,从底层逻辑到实践逐步深入: ### 一、认知基础阶段(1-2周) 1. **计算机组成原理** - 理解冯·诺依曼架构:CPU=大脑,内存=短期记忆,硬盘=长期记忆 - 二进制入门:用开关电路理解0/1的物理实现 - 存储单位换算:1MB=1024KB=1,048,576字节 2. **操作系统初探** - 文件系统树形结构:Windows的C盘/Linux的根目录 - 进程概念:程序运行时的"生命体" - 注册表/配置文件:系统设置的DNA ### 二、编程思维培养(3-8周) 1. **Python入门** ```python # 理解编程本质:数据转换器 def celsius_to_fahrenheit(c): return c * 9/5 + 32 print(f"37℃ = {celsius_to_fahrenheit(37)}℉") ``` - 掌握基础语法结构(顺序/分支/循环) - 理解数据类型的底层存储差异 - 文件操作:实现简单日记本程序 2. **算法思维训练** - 时间复杂度可视化:对比O(n)与O()的增长曲线 - 经典算法实践: - 冒泡排序(可视化演示) - 二分查找(电话簿查找模拟) ### 三、计算机系统认知(2-3个月) 1. **网络协议栈** - 模拟TCP三次握手:写信-回执-确认的通信过程 - 用Wireshark抓包分析HTTP请求 2. **数据库原理** ```sql -- 设计个人博客数据库 CREATE TABLE posts ( id INT PRIMARY KEY, title VARCHAR(255), content TEXT, created_at TIMESTAMP ); ``` 3. **Linux系统实践** - 虚拟机安装Ubuntu - Shell脚本自动化:批量重命名照片 - 权限管理:chmod 755的实际意义 ### 四、工程化能力建设(持续) 1. **开发工具链** - Git版本控制:创建个人代码仓库 - Docker容器化:打包开发环境 - CI/CD流水线:自动部署静态网站 2. **项目实战建议** - 初级:开发Markdown笔记转换器 - 中级:实现RSS阅读器带数据统计 - 高级:构建物联网温度监控系统 ### 、学习资源导航 1. **理论奠基** -计算机科学导论》(Behrouz Forouzan) - CS50公开课哈佛大学) 2. **实践平台** - LeetCode每日一题(从简单难度起步) - Kaggle机器学习入门竞赛 3. **社区互动** - Stack Overflow提问技巧 - GitHub开源项目协作规范 关键成长指标: - 第1个月:能独立编写100行左右的实用脚本 - 第3个月:完成首个全栈项目部署 - 第6个月:形成个人技术知识体系框架 注意避免的认知陷阱: 1. 不要陷入"最新技术"焦虑,先掌握通用原理 2. 警惕过度依赖可视化工具,理解底层实现 3. 编程语言只是工具,计算思维才是核心 学习曲线管理建议: - 每天保持1-2小时深度学习 - 每周完成1个mini-project - 每月进行知识体系复盘 通过这种结构化学习路径,配合刻意练习,零基础学习者可在6-12个月内建立完整的计算机知识框架,并具备基础开发能力。重要的是保持持续学习的节奏,在实践中不断深化理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值