• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C Primer Plus(第六版)中文版 中的错误1

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #define TSIZE 45
 5 
 6 struct film {
 7     char title[TSIZE];
 8     int rating;
 9     struct film *next;
10 };
11 char * s_gets(char * st, int n);
12 
13 int main(void)
14 {
15     struct film * head = NULL;
16     struct film * prev;
17     struct film * current;
18     char input[TSIZE];
19 
20     puts("Enter first movie title:");
21     while(s_gets(input, TSIZE) != NULL && input[0] != \'\0\')
22     {
23         current = (struct film *) malloc(sizeof(struct film));
24         if(head == NULL)
25             head = current;
26         else
27             prev->next = current;
28         current->next = NULL;
29         strcpy(current->title, input);
30         puts("Enter your rating <0-10>:");
31         scanf("%d", &current->rating);
32         while(getchar() != \'\n\')
33             continue;
34         puts("Enter next movie title (empty line to stop):");
35         prev = current;
36     }
37 
38     if(head == NULL)
39         printf("No data entered. ");
40     else
41         printf("Here is the movie list:\n");
42     current = head;
43     while(current != NULL)
44     {
45         printf("Movie: %s Rating: %d\n",
46                current->title, current->rating);
47         current = current->next;
48     }
49 
50     current = head;
51     while(current != NULL)
52     {
53         current = head;
54         head = current->next;
55         free(current);
56     }
57     printf("Bye!\n");
58 
59     return 0;
60 }
61 
62 char * s_gets(char * st, int n)
63 {
64     char * ret_val;
65     char * find;
66 
67     ret_val = fgets(st, n, stdin);
68     if(ret_val)
69     {
70         find = strchr(st, \'\n\');
71         if(find)
72             *find = \'\0\';
73         else
74             while(getchar() != \'\n\')
75                 continue;
76     }
77 
78     return ret_val;
79 }
View Code

上面的代码来自《C Primer Plus》(第六版)中文版,第573-574页。

其中代码的第51行有错误。

不知道这个错误是印刷有错,还是原书有错。在此指出。

 

改正代码:

是将第51行的while(current != NULL)改为

while (head != NULL)就可以了。

 

原因如下:

将第51-56行代码之间添加一些输出,代码如下:

 1     while(current != NULL)
 2     {
 3         printf("current1 = %p\n", current);
 4         printf("head1 = %p\n\n",head);
 5         current = head;
 6         printf("current2 = %p\n", current);
 7         printf("head2 = %p\n\n",head);
 8         head = current->next;
 9         printf("current3 = %p\n", current);
10         printf("head3 = %p\n\n",head);
11         free(current);
12         printf("current4 = %p\n", current);
13         printf("head4 = %p\n\n",head);
14     }
View Code

输出结果如下:

 

从上面的输出结果可以看出,最后一个head2指针已经是00000000了,是一个指向未知地址的指针。所以再次释放一个current就会出错。

 改正后的输出:

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
(三十七)c#Winform自定义控件-有标题的面板-HZHControls发布时间:2022-07-13
下一篇:
c# App.Config详解发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap