首页 > 代码库 > 发现中文版《C Primer Plus第五版》示例程序的一个错误
发现中文版《C Primer Plus第五版》示例程序的一个错误
错误的程序出现再第17章的499页ListItemCount()和500页的Traverse()两个函数上。
原著包含所有函数定义的list.c如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include "list.h" 4 5 static void CopyToNode(Item item,Node * pnode); 6 7 void InitializeList(List * plist) 8 { 9 *plist = NULL;//movie = NULL10 }11 12 bool ListIsEmpty(const List * plist)13 {14 if(*plist==NULL)15 return true;16 else17 return false;18 }19 20 bool ListIsFull(const List * plist)21 {22 Node * pt;23 bool full;24 pt = (Node *)malloc(sizeof(Node));25 if(pt==NULL)26 full = true;27 else28 full = false;29 free(pt);30 return full;31 }32 33 34 unsigned int ListItemCount(const List * plist)35 {36 unsigned int count = 0;37 Node * pnode = *plist;38 39 while(pnode!=NULL)40 {41 ++count;42 pnode = pnode->next;43 }44 return count;45 }46 47 48 bool AddItem(Item item,List *plist)49 {50 Node * pnew;51 Node * scan = *plist;52 53 pnew = (Node *)malloc(sizeof(Node));54 if(pnew == NULL)55 return false;56 57 CopyToNode(item,pnew);58 pnew->next = NULL;59 if(scan==NULL)60 *plist = pnew;61 else62 {63 while(scan->next!=NULL)64 scan = scan->next;65 scan->next = pnew;66 }67 return true;68 }69 70 71 void Traverse(const List * plist,void(*pfun)(Item item))72 {73 Node * pnode = *plist;74 while(pnode!=NULL)75 {76 (*pfun)(pnode->item);77 pnode = pnode->next;78 }79 }80 81 82 void EmptyTheList(List * plist)83 {84 Node * psave;85 while(*plist!=NULL)86 {87 psave = (*plist)->next;88 free(*plist);89 *plist = psave;90 }91 }92 93 94 95 static void CopyToNode(Item item,Node * pnode)//静态函数限制该函数只能在本文件内使用96 {97 pnode->item = item;98 }
但是在film3.c中调用的形式分别如下:
1 Traverse(movies,showmovies); //传递的是movies指针的拷贝2 3 printf("You entered %d movies.\n",ListItemCount(movies)); //传递的也是movies指针的拷贝
也就是说,函数调用的时候已经传递的是指针了,但函数体内调用时却又把它当成指针的地址,及指向指针的指针,从而发生错误
解决的方法有两个,一是更改函数调用如下:
1 Traverse(&movies,showmovies); //传递的是movies指针的地址2 3 printf("You entered %d movies.\n",ListItemCount(&movies));//传递的也是movies指针的地址
二是更改这两个函数的函数体:
1 unsigned int ListItemCount(const List * plist) 2 { 3 unsigned int count = 0; 4 Node * pnode = plist; 5 6 while(pnode!=NULL) 7 { 8 ++count; 9 pnode = pnode->next;10 }11 return count;12 }13 14 void Traverse(const List * plist,void(*pfun)(Item item))15 {16 Node * pnode = plist;17 while(pnode!=NULL)18 {19 (*pfun)(pnode->item);20 pnode = pnode->next;21 }22 }
总之两个方法都可以,不知道是原著的错误,还是出版社校准的错误,希望大家能看出来。
发现中文版《C Primer Plus第五版》示例程序的一个错误
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。