[英]How do I fix this seg fault?
我在第 151 行找不到導致我的段錯誤的原因。我不明白為什么會出現段錯誤。 我必須將客戶進入排隊的時間加上 5 * 結賬時的物品數量 + 收銀員的 30。
標准輸入
樣本輸入
2
5
10 1 史蒂文 12
12 6 艾哈邁德 8
13 1 珍妮 40
22 6 傑梅因 39
100000 12 阿瑪利亞 53
6
100 1 100
200 2 乙 99
300 3 C 98
400 4 D 97
500 5 96
600 6 樓 95
樣品 Output
第 1 行的 STEVEN 在時間 100 結帳。
第 6 行的 AHMAD 在時間 170 結帳。
第 6 行的 JERMAINE 在 395 時間結帳。
來自 1 號線的 JENNY 在 625 時間結賬。
第 12 行的 AMALIA 在時間 100295 結帳。
來自第 1 行的 A 在時間 630 簽出。
第 6 行的 F 在時間 1135 結帳。
第 5 行的 E 在時間 1645 結帳。
第 4 行的 D 在時間 2160 簽出。
第 3 行的 C 在時間 2680 簽出。
第 2 行的 B 在時間 3205 結帳。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
// customer record
typedef char customerName[9];
typedef struct customer {
customerName name; // 1-9 upper case letters
int lineNumber; // line number customer gets on
int time; // arrival time at line
int numberItems; // number of items customer has
} customer;
// [singly linked] queue element
typedef customer *qitem;
typedef struct node {
qitem data; // pointer to actual data
struct node *next; // forward pointer to next item
} node;
// queue definition (singly linked list)
// NOTE:
typedef struct queue {
node *front; // pointer to first node in list ie front of line with cashier
} queue;
// qinit -- initialize/reset queue
void qinit(queue *q)
{
q->front = NULL;
}
// qempty -- returns 1 if empty or 0 if false
int qempty(queue *q)
{
return (q->front == NULL);
}
// enqueue -- append element to end of queue
void enqueue(queue *q, qitem data)
{
node *newnode;
node *prev;
newnode = malloc(sizeof(node));
newnode->next = NULL;
newnode->data = data;
// find the back of the queue with only a front pointer
prev = NULL;
for (node *cur = q->front; cur != NULL; cur = cur->next)
prev = cur;
// append to tail of list
if (prev != NULL)
prev->next = newnode;
// add to end of empty list
else
q->front = newnode;
}
// dequeue -- dequeue from the front of the queue
qitem dequeue(queue *q)
{
node *curnode;
qitem data;
do {
curnode = q->front;
if (curnode == NULL) {
data = NULL;
break;
}
// get node's data value (e.g. pointer to customer struct)
data = curnode->data;
// release the node's storage back to the heap
free(curnode);
} while (0);
return data;
}
// qfront -- peek at front of queue
qitem qfront(queue *q)
{
node *curnode;
qitem data;
curnode = q->front;
if (curnode != NULL)
data = curnode->data;
else
data = NULL;
return data;
}
int main(int argc, const char * argv[]) {
int testCases = 0;
scanf("%d", &testCases);
if(testCases > 0 && testCases <= 25){//shortcircuiting???
while (testCases--){
int numCustomers;
scanf("%d", &numCustomers);
if(numCustomers < 0 || numCustomers > 11){
return 0;
}
queue* customerArray = (queue*) malloc(sizeof(queue) * 12);
for ( int i = 0; i < numCustomers; i++){
qinit(customerArray);// starting new queue
customer* newCustomer = (customer*) malloc(sizeof(customer));
scanf("%d", &(newCustomer->time));
scanf("%d", &(newCustomer->lineNumber));
scanf("%s", newCustomer->name);
scanf("%d", &(newCustomer->numberItems));
enqueue(&customerArray[newCustomer->lineNumber - 1], newCustomer);
}
int totalTime = INT_MAX;
for(int i=0;i<12;i++)
{
customer* frontCustomer = qfront(&customerArray[i]);
if(totalTime < frontCustomer->time)
{
totalTime = frontCustomer->time;
}
}
while(numCustomers--) {
int customerToCheckOutLine = 0; int minNumberOfItems = INT_MAX;
for( int j=11 ; j>=0; j--){
customer* frontCustomer = qfront(&customerArray[j]);
if(frontCustomer->time <= totalTime)
{
if(frontCustomer->numberItems < minNumberOfItems)
{
customerToCheckOutLine = frontCustomer->lineNumber;
minNumberOfItems = frontCustomer->numberItems;
}
}
free(frontCustomer);
}
customer* customerToCheckOut = qfront(&customerArray[customerToCheckOutLine -1 ]);
totalTime += 30;
totalTime += (customerToCheckOut->numberItems) * 5;
dequeue(&customerArray[customerToCheckOutLine - 1]);
}
free(customerArray);
}
}
return 0;
}
這一行:
qinit(customerArray);// starting new queue
錯了,應該是初始化customerArray+i。
但這條線很奇怪:
enqueue(&customerArray[newCustomer->lineNumber - 1], newCustomer);
因為它可以使用尚未初始化的 aq,並且由於 lineNumber 沒有經過值檢查,所以幾乎可以是任何東西。
但由於上述一種或兩種原因,這一行:
customer *frontCustomer = qfront(&customerArray[i]);
可以返回NULL; 但是沒有檢查,你go就使用frontCustomer而不檢查,所以你的程序是SEGV的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.