簡體   English   中英

如何解決此段錯誤?

[英]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.

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