C-队列未正确存储值

C-队列未正确存储值,c,memory,struct,queue,malloc,C,Memory,Struct,Queue,Malloc,我试图在C中实现一个队列(使用),其中,给定一个输入文件,其中有一些行,每个行包含5个值,为该行创建一个结构项,并将值分配给结构变量value1…value5。然后将结构放在队列中,因此文件的第一行将是队列中的第一个结构,最后一行将是最后一个结构 然而,当我试图从队列中的结构读取值时,会出现一些奇怪的行为。下面代码段的末尾打印value1和value5作为调试检查,以确保值正确。它应该在第一次迭代中打印头和尾的struct1->value1和struct1->value5,然后在第二次迭代中打印

我试图在C中实现一个队列(使用),其中,给定一个输入文件,其中有一些行,每个行包含5个值,为该行创建一个结构
,并将值分配给结构变量
value1
value5
。然后将结构放在队列中,因此文件的第一行将是队列中的第一个结构,最后一行将是最后一个结构

然而,当我试图从队列中的结构读取值时,会出现一些奇怪的行为。下面代码段的末尾打印
value1
value5
作为调试检查,以确保值正确。它应该在第一次迭代中打印头和尾的
struct1->value1
struct1->value5
,然后在第二次迭代中打印头的
struct1->value1
struct1->value5>和尾的
struct2->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
这:


看起来不对,它与您从队列中查看项目的方式不匹配。如果队列正在存储指针,则将其交给
newItem
,而不是
newItem

queue\u push\u tail(itemQueue,newItem)的地址注意正在推送的值。这是有效的!我还在学习复杂的指针,非常感谢你的帮助。非常感谢。如果按值传递项,则会泄漏内存。请注意,此更改虽然本身是正确的,但也需要其他更改。如果您在受支持的平台上,则使用检查是否存在泄漏。
queue_push_tail(itemQueue, &newItem);