zoukankan      html  css  js  c++  java
  • C Primer Plus(第六版)中文版 中的错误1

     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] != '')
    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() != '
    ')
    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:
    ");
    42     current = head;
    43     while(current != NULL)
    44     {
    45         printf("Movie: %s Rating: %d
    ",
    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!
    ");
    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, '
    ');
    71         if(find)
    72             *find = '';
    73         else
    74             while(getchar() != '
    ')
    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
    ", current);
     4         printf("head1 = %p
    
    ",head);
     5         current = head;
     6         printf("current2 = %p
    ", current);
     7         printf("head2 = %p
    
    ",head);
     8         head = current->next;
     9         printf("current3 = %p
    ", current);
    10         printf("head3 = %p
    
    ",head);
    11         free(current);
    12         printf("current4 = %p
    ", current);
    13         printf("head4 = %p
    
    ",head);
    14     }
    View Code

    输出结果如下:

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

     改正后的输出:

  • 相关阅读:
    LeetCode偶尔一题 —— 617. 合并二叉树
    《剑指offer》 —— 链表中倒数第k个节点
    《剑指offer》 —— 青蛙跳台阶问题
    《剑指offer》—— 二维数组中的查找
    《剑指offer》—— 替换空格
    《剑指offer》—— 合并两个排序的链表
    《剑指offer》—— 礼物的最大价值
    生成Nuget 源代码包来重用你的Asp.net MVC代码
    Pro ASP.Net Core MVC 6th 第四章
    Pro ASP.NET Core MVC 6th 第三章
  • 原文地址:https://www.cnblogs.com/lanshanxiao/p/6131098.html
Copyright © 2011-2022 走看看