发现中文版《C Primer Plus第五版》示例程序的一个错误
错误的程序出现再第17章的499页ListItemCount()和500页的Traverse()两个函数上。
原著包含所有函数定义的list.c如下:
#include<stdio.h>
#include<stdlib.h>
#include "list.h" static void CopyToNode(Item item,Node * pnode); void InitializeList(List * plist)
{
*plist = NULL;//movie = NULL
} bool ListIsEmpty(const List * plist)
{
if(*plist==NULL)
return true;
else
return false;
} bool ListIsFull(const List * plist)
{
Node * pt;
bool full;
pt = (Node *)malloc(sizeof(Node));
if(pt==NULL)
full = true;
else
full = false;
free(pt);
return full;
} unsigned int ListItemCount(const List * plist)
{
unsigned int count = ;
Node * pnode = *plist; while(pnode!=NULL)
{
++count;
pnode = pnode->next;
}
return count;
} bool AddItem(Item item,List *plist)
{
Node * pnew;
Node * scan = *plist; pnew = (Node *)malloc(sizeof(Node));
if(pnew == NULL)
return false; CopyToNode(item,pnew);
pnew->next = NULL;
if(scan==NULL)
*plist = pnew;
else
{
while(scan->next!=NULL)
scan = scan->next;
scan->next = pnew;
}
return true;
} void Traverse(const List * plist,void(*pfun)(Item item))
{
Node * pnode = *plist;
while(pnode!=NULL)
{
(*pfun)(pnode->item);
pnode = pnode->next;
}
} void EmptyTheList(List * plist)
{
Node * psave;
while(*plist!=NULL)
{
psave = (*plist)->next;
free(*plist);
*plist = psave;
}
} static void CopyToNode(Item item,Node * pnode)//静态函数限制该函数只能在本文件内使用
{
pnode->item = item;
}
但是在film3.c中调用的形式分别如下:
Traverse(movies,showmovies); //传递的是movies指针的拷贝
printf("You entered %d movies.\n",ListItemCount(movies)); //传递的也是movies指针的拷贝
也就是说,函数调用的时候已经传递的是指针了,但函数体内调用时却又把它当成指针的地址,及指向指针的指针,从而发生错误
解决的方法有两个,一是更改函数调用如下:
Traverse(&movies,showmovies); //传递的是movies指针的地址
printf("You entered %d movies.\n",ListItemCount(&movies));//传递的也是movies指针的地址
二是更改这两个函数的函数体:
unsigned int ListItemCount(const List * plist)
{
unsigned int count = ;
Node * pnode = plist; while(pnode!=NULL)
{
++count;
pnode = pnode->next;
}
return count;
} void Traverse(const List * plist,void(*pfun)(Item item))
{
Node * pnode = plist;
while(pnode!=NULL)
{
(*pfun)(pnode->item);
pnode = pnode->next;
}
}
总之两个方法都可以,不知道是原著的错误,还是出版社校准的错误,希望大家能看出来。
发现中文版《C Primer Plus第五版》示例程序的一个错误的更多相关文章
- 推荐《C Primer Plus(第五版)中文版》【worldsing笔记】
老外写的C书,看了你会有一种哇塞的感觉,这里提供PDF扫描版的下在,包含数内的例程,请大家支持原版!! C Primer Plus(第五版)中文版.pdf 下载地址:http://pan.bai ...
- C Primer Plus(第五版)1
这是C Primer Plus(第五版)的第一章,上传上来主要是方便我进行做笔记,写注释,还有我会删掉一些“废话”等. 1.1 C语言的起源 贝尔实验室的 Dennis Ritchie 在1972年开 ...
- Primer C++第五版 读书笔记(一)
Primer C++第五版 读书笔记(一) (如有侵权请通知本人,将第一时间删文) 1.1-2.2 章节 关于C++变量初始化: 初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义 ...
- 《C++Primer》第五版习题详细答案--目录
作者:cosefy ps: 答案是个人学习过程的记录,仅作参考. <C++Primer>第五版习题答案目录 第一章:引用 第二章:变量和基本类型 第三章:字符串,向量和数组 第四章:表达式
- 《C++Primer》第五版习题答案--第三章【学习笔记】
[C++Primer]第五版[学习笔记]习题解答第三章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/10 第三章:字符串,向量和数组 ...
- 《C++Primer》第五版习题解答--第四章【学习笔记】
[C++Primer]第五版习题解答--第四章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/11 第四章:表达式 练习4. ...
- 《C++Primer》第五版习题答案--第五章【学习笔记】
<C++Primer>第五版习题答案--第五章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/15 第五章:语句 ...
- 《C++Primer》第五版习题答案--第六章【学习笔记】
<C++Primer>第五版习题答案--第六章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/16 第六章:函数 ...
- C++primer(第五版)Sales_item.h头文件
C++primer(第五版)1.51练习章节需要有一个Sales_item类,但是给的网站找不到,直接复制下面就好咯: #ifndef SALESITEM_H #define SALESITEM_H ...
随机推荐
- [Head First Python]2. BIF(内置函数)
1- range() >>> for each in range(2): print(each) ... 0 1
- python2 ----函数字典的使用
问题背景: 最近在用python2为sublime2写一个插件,其中有一个命令功能,就是输入不同的命令调用不同的函数,但是python不支持switch,只用ifelse的话感觉特别的low而且明显不 ...
- 异常处理与调试 - 零基础入门学习Delphi50
异常处理与调试 让编程改变世界 Change the world by program 异常处理与调试 在应用程序开发中如何检测.处理程序的运行错误是一个很重要的问题. 有些错误是无法控制的. 如何处 ...
- 线程池 异步I/O线程 <第三篇>
在学习异步之前先来说说异步的好处,例如对于不需要CPU参数的输入输出操作,可以将实际的处理步骤分为以下三步: 启动处理: 实际的处理,此时不需要CPU参数: 任务完成后的处理: 以上步骤如果仅仅使用一 ...
- SQL Server 2005中的分区表(四):删除(合并)一个分区
在前面我们介绍过如何创建和使用一个分区表,并举了一个例子,将不 同年份的数据放在不同的物理分区表里.具体的分区方式为: 第1个小表:2010-1-1以前的数据(不包含2010-1-1). 第2个小表: ...
- xsd转实体类
话说VS自带的工具,可以将xsd或者xml格式的文件转成实体类,大概格式如下 使用VS2005工具XSD.exe(SDK/v2.0/Bin/xsd.exe)自动生成实体类: xsd /c /names ...
- gdb 调试coredump文件过程
gdb 调试coredump文件过程: 第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢? 1. ps -fax|grep 进程名称 找到 ...
- kiki's game
欢迎参加——BestCoder周年纪念赛(高质量题目+多重奖励) kiki's game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: ...
- static_cast
C 风格(C-style)强制转型例如以下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这 ...
- 图像处理中像素点的问题:unsigned char 和 char
以前在做图像处理的时候,一直不太在意这个问题,对图像每个像素点的灰度值,总是认为char也可,unsigned char也可.尽管它们都是8位,但是表示的数的范围却不相同:char: -128~127 ...