返回介绍

用 strdup() 修复代码

发布于 2024-10-10 23:21:29 字数 2447 浏览 0 评论 0 收藏 0

可以用

strdup() 修复原来的 create() 函数:island* create(char *name){ island *i = malloc(sizeof(island)); i->name =


strdup(name); i->opens = "09:00"; i->closes = "17:00"; i->next = NULL; return i;}





你会发现我们只需要对 name 字段使用 strdup() 函数就行了,知道为什么吗?

因为我们把 open 和 close 字段设为了字符串字面值。还记得存储器的分布图吗?字符串字面值位于存储器的只读区域,该区域专门用来分配常量。把 open 和 close 的值设为常量,即使不复制也无所谓,因为它们不会改变。但为了防止出错必须复制 name 数组,因为后面的代码可能修改它。这里没有蠢问题问:如果 island 结构用数组保存岛名,而不是字符指针,还需要用 strdup() 吗?答:不需要,如果用数组,每个 island 结构都会保存自己的副本,不需要你自己创建。问:那为什么要在数据结构中使用字符指针而不是字符数组呢?答:字符指针不会限制字符串的大小。如果用字符数组,需要提前决定字符串的长度。

能改好吗?

为了验证这些修改能否修复代码,我们再次运行原来的代码:

现在,代码正确工作了。用户每输入一个岛名,create() 函数都把它保存在了新的字符串中。

好了,创建岛屿数据的函数你已经有了,我们用它来根据文件创建链表。

游泳池拼图

真倒霉!用来创建飞行之旅的代码掉进了游泳池!你的任务是从泳池中取出代码片段,填入以下的空白横线处。你的目标是重构程序,程序从标准输入读取一列岛名,然后将它们连成链表。每个代码片段只能使用一次,但不是所有片段都用得到。

游泳池拼图解答

真倒霉!用来创建飞行之旅的代码掉进了游泳池!你的任务是从泳池中取出代码片段,填入以下空白横线处。你的目标是重构程序,程序从标准输入读取一列岛名,然后将它们连成链表。

磨笔上阵

等等!还没完呢。别忘了,只要用 malloc() 函数分配了空间,就需要用 free() 函数释放它们。到目前为止,程序用 malloc() 在堆上创建了 island 链表,但当用完时没有释放这些空间,下面来写这部分代码。以下是 release() 函数的开头部分,只要把第一座岛的指针传给它,release() 就会释放链表使用的所有存储器:好好想想,释放存储器时,要释放哪些东西?只有 island ,或者还有其他东西?应该按什么顺序释放它们?

 

磨笔上阵解答

等等!还没完呢。别忘了,只要用 malloc() 函数分配了空间,就需要用 free() 函数释放它们。到目前为止,程序用 malloc() 在堆上创建了 island 链表,但当用完时没有释放这些空间,下面来写这部分代码。以下是 release() 函数的开头部分,只要把第一座岛的指针传给它,release() 就会释放链表使用的所有存储器:释放存储器时,要释放哪些东西?只有 island ,或者还有其他东西?应该按什么顺序释放它们?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文