簡體   English   中英

將“ for”與指針用作循環變量時的無限循環

[英]Infinite Loop when using 'for' with pointer as loop variable

我對編碼很陌生,遇到了問題。 我嘗試自己解決該問題,並進行了很多次谷歌搜索,但是我仍然沒有解決方案。 也許你們其中之一可以幫助您?

這是我的代碼:

int main(int argc, char **argv) {
    struct node {
        char *str;
        int count;
        struct node *next;
    };

    struct node head = { argv[1], 1, NULL };
    for (int i = 2; i < (argc); i++) {
        for (struct node *p = &head; (p != NULL); p = p->next) {
            printf("%s,%s\n", argv[i], p->str);
            if (strcmp(argv[i], p->str) == 0) {
                printf("case1\n");
                p->count++;
                break;
            }
            else if ((strcmp(argv[i], p->str) != 0) && p->next) {
                printf("case2\n");
                printf("Adresse, auf die p zeigt: %p", &p);
                continue;
            }
            else if ((strcmp(argv[i], p->str) != 0) && (!p->next)) {
                printf("case3\n");
                struct node *oldhead = &head;
                head.str = argv[i];
                head.count = 1;
                head.next = oldhead;
                break;
            }

        }
    }

    // Print how many times each string appears

    return 0;
}

目的是創建一個鏈接列表,其中包含我在調用程序時提供給main()所有參數。 如果有重復項,則結構應將其計數。 例如,如果我像./a.out foo fool foo這樣調用程序,則結果應為長度為2的列表,其中第一個元素包含字符串"foo" ,計數為2 ,第二個元素包含字符串"fool"並且計數為1 問題是內部for循環中的else if -statement。 這是其中內for循環應該實際使用,並為其分配的唯一部分p->nextp 不幸的是,這沒有發生。 結果是內部的for循環一遍又一遍地開始,並且指針p一直一直指向相同的地址(我用printf找出了)。

你們中的任何一個有一個想法,這可能是什么問題嗎? 我盡了一切努力,並嘗試在網上找到解決方案...

非常感謝!!!

問題出在代碼的這一部分

   else if ((strcmp(argv[i], p->str) != 0) && (!p->next)) {
        printf("case3\n");
        struct node *oldhead = &head;
        head.str = argv[i];
        head.count = 1;
        head.next = oldhead;
        break;
    }

您需要分配一個新的結構,然后將其地址放在最后一個結構條目中。

       else if ((strcmp(argv[i], p->str) != 0) && (!p->next)) {
            printf("case3\n");
            struct node *oldhead = p;
            p = (struct node *) malloc(sizeof(node));
            if (p == NULL) { .... manage the error ... }
            oldhead->next = p;
            p->str = argv[i];
            p->count = 1;
            p->next = NULL;
            break;
        }

現在,您正在創建節點並將它們串在一起。 您之前實際上是在更新同一node

        struct node *oldhead = &head;
        head.str = argv[i];
        head.count = 1;
        head.next = oldhead;

那不是在創建一個新節點。 它只是創建對同一節點的新引用,因此當您嘗試讀取鏈接列表直到最后時會導致無限循環。 因此,您的程序只有一個節點。 您實際上需要分配並創建新的。

這里的主要問題是

struct node *oldhead = &head;

你應該做malloc

struct node *oldhead = (struct node*) malloc(sizeof(struct node));

因此您實際上為新節點分配了一塊內存。 並且由於您具有malloc ,因此您也應該在程序結束時進行free

while(...) {
   free(deepest_node)
}

進行上述循環的方法是從鏈接列表中最遠的節點一直返回到head

另一個問題是,您不應將新節點附加到head

head.next = oldhead;

但應該是p ,它是鏈接列表中的最后一個節點:

p -> next = oldhead;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM