【问题标题】:Why Is this basic C program causing an infinite loop?为什么这个基本的 C 程序会导致无限循环?
【发布时间】:2016-01-24 10:00:04
【问题描述】:

我的任务是构建一个“代表堆栈”的基本链表。所以只能按照后进先出原则访问数据。我必须在那个“堆栈”上应用某些功能。 我的代码编译得很好,但在执行时,它只会无限打印 1。我不知道这是怎么回事,因为我实际上只使用了一个 while 循环。 有谁知道我的问题是什么?也许我将来如何防止此类错误。感谢您的任何帮助。并提前道歉,我是初学者!

    #include <stdio.h>
#include <stdlib.h>


typedef struct Stack {
    struct Stack *next;
    int data;
} Stack;

Stack* push(Stack*head, int d) {   //add a datapoint to the top of the stack
    Stack *temp;
    temp=malloc(sizeof(Stack));
    temp->data=d;
    temp->next=head;

    return temp;
}


Stack* pop(Stack*head) {      //read the top data point, and delete it
    Stack* newHead=head->next;
    printf("%i", head->data );
    free(head);
    return newHead;
}

int peek(Stack*head) {   // return the top datapoint, without delete
    return head->data;
}

void isempty(Stack*head) {     
    if (head==NULL) {
        printf("Stack empty");
    }

    printf("Stack has data");
}

void print(Stack*head) {    //print complete Stack
    Stack* cursor;
    cursor=head;

    while (cursor!=NULL) {
        printf("%i", cursor->data);
    }
}
int main(int argc, const char * argv[]) {
    Stack* head;
    head=malloc(sizeof(Stack));
    head=NULL;
    head=push(head, 4);
    head=push(head, 2);
    head=push(head, 1);
    printf("%i", peek(head));
    print(head);
    head=pop(head);
    print(head);
    isempty(head);
    head=pop(head);
    head=pop(head);
    isempty(head);


    return 0;
}

【问题讨论】:

  • head=malloc(sizeof(Stack)); head=NULL; 这两个语句实现了什么?
  • 删除 main 中的 head=malloc(sizeof(Stack)); 行 - 这不是必需的

标签: c linked-list infinite-loop


【解决方案1】:

您不会在函数 print 中增加 cursor

    while (cursor!=NULL) {
        printf("%i", cursor->data);
   }

这里的代码也会泄露内存:

head=malloc(sizeof(Stack));
head=NULL;

【讨论】:

    【解决方案2】:

    在这段代码中:

    while (cursor!=NULL) {
        printf("%i", cursor->data);
    }
    

    你没有改变光标。所以改成

    for (cursor = head; cursor!=NULL; cursor = cursor->next) {
        printf("%i", cursor->data);
    }
    

    【讨论】:

      【解决方案3】:

      您在函数print 中有一个无限循环。您需要在循环内更新cursor,否则它将永远循环。以下是我的做法:

      void print(Stack*head) {    //print complete Stack
          Stack* cursor;
      
          for (cursor = head; cursor != NULL; cursor = cursor->next) {
              printf("%i", cursor->data);
          }
      }
      

      【讨论】:

        【解决方案4】:

        while循环有问题:

        while (cursor!=NULL) {
            printf("%i", cursor->data);
            cursor = cursor->next; // you forgot this line
        }
        

        没有这一行,光标永远不会改变。

        【讨论】:

          【解决方案5】:

          您必须在函数print 中的循环中向前迈出一步:

          void print( Stack*head )
          {
              Stack* cursor = head;
              while (cursor != NULL)   // 
              {
                  printf("%i", cursor->data);
                  cursor = cursor->next; // step one forward
              }
          }
          

          还有内存泄漏。您为变量 head 分配内存,但在之后将其设置为 NULL

          Stack* head;
          // head=malloc(sizeof(Stack)); // delete this
          head=NULL;
          

          【讨论】:

            猜你喜欢
            • 2011-08-13
            • 1970-01-01
            • 2013-06-17
            • 1970-01-01
            • 1970-01-01
            • 2012-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多