2014-03-02 91 views
0

我想在C中實現一個隊列(使用this implementation),其中,給定一個輸入文件,每行包含5個值的行數,爲該行創建一個結構Item,值被分配給結構變量value1 ... value5。然後將該結構放置在一個隊列中,這樣文件的第一行就是隊列中的第一個結構,最後一行將是最後一個結構。C - 隊列沒有正確存儲值

但是,在嘗試從隊列中的結構中讀取值時,我遇到了一些奇怪的行爲。下面代碼段的結尾打印value1value5作爲調試檢查,以確保值是正確的。它應該在第一次迭代中打印struct1->value1struct1->value5,然後在第一次迭代中打印struct1->value1struct1->value5,在第二次迭代中打印struct2->value1struct2->value5,但打印頭和尾都打印出奇怪的大值。 (另外,它似乎完全忘記了第一個結構。)我在這裏做錯了什麼?

Sample file: 
1 0 10 1 3 
2 0 10 10 1 
------------ 
/* read input file */ 
/* while the current line of the file is not null */ 
... 
    /* create new item */ 
    Item *newItem = malloc(sizeof(Item)); 

    /* string tokenizer */ 
    /* adds tokens from current line to tokens[i] */ 
    ... 

    /* set item variables */ 
    newItem->value1 = strtol(tokens[0], NULL, 10); //should contain e.g. 1 
    newItem->value2 = strtol(tokens[1], NULL, 10); //should contain e.g. 0 
    newItem->value3 = strtol(tokens[2], NULL, 10); //should contain e.g. 10 
    newItem->value4 = strtol(tokens[3], NULL, 10); //should contain e.g. 1 
    newItem->value5 = strtol(tokens[4], NULL, 10); //should contain e.g. 3 

    /* add to item queue */ 
    queue_push_tail(itemQueue, &newItem); 

    /* check queue values */ 
    if(!queue_is_empty(itemQueue)) {      //after two lines, 
     Item *itemHead = queue_peek_head(itemQueue);  //this should differ... 
     printf("Head: %d %d\n", itemHead->value1, itemHead->value5); 
     Item *itemTail = queue_peek_tail(processQueue);  //...from this 
     printf("Tail: %d %d\n", itemTail->value1, itemTail->value5); 
    } 

預期輸出:

Head: 1 3 //when first line is read 
Tail: 1 3 
Head: 1 3 //when second line is read 
Tail: 2 1 

實際輸出:

Head: 146752 -4196581 //when first line is read 
Tail: 146752 -4196581 
Head: 146792 -4196581 //when second line is read 
Tail: 146792 -4196581 
+0

'queue_push_tail(itemQueue,newItem);'注意被推入的值。 – WhozCraig

回答

2

此:

queue_push_tail(itemQueue, &newItem); 

看起來不正確的,它不符合你怎麼偷看來自隊列中的項目。如果隊列存儲指針,則將其傳遞給newItem,而不是地址newItem

+0

This Works!我仍然在學習指針的複雜性,所以你的幫助非常感謝。謝謝! – user41419

+2

如果按價值傳遞商品,則會泄漏內存。請注意,這一改變雖然正確,但也需要其他改變。如果您使用的是受支持的平臺,請使用['valgrind'](http://valgrind.com)檢查是否有泄漏。 –