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