簡體   English   中英

優先隊列分割故障

[英]priority queue segmentation fault

我正在使用優先級隊列,其優先級為double。 我猜這是問題的原因。 我首先使用這些數字沒有問題。

34.365681 34.481879 34.539832 36.715120

然后,我使用這些數字,並遇到了細分錯誤。

45.411042 40.481879 37.702110 38.951187

struct PRIORITYQUEUE
    {
    int x_pq; 
    int y_pq;
    double heuristic_pq;
    int priority;
    int info;
    struct PRIORITYQUEUE *next;
}*start, *q, *temp, *new;

typedef struct PRIORITYQUEUE *N;

void insert(int x, int y, double heuristic)
{

    int item; 
    double itprio;
    //new = ( N* ) malloc( sizeof( N ) );
    new = malloc( sizeof( N ) );

    itprio = heuristic;
    new->x_pq = x;
    new->y_pq = y;
    new->heuristic_pq = itprio;

    if ( start == NULL || itprio < start->heuristic_pq )
    {
        new->next = start;
        start = new;
    }
    else
        {
            q = start;
            while ( q->next != NULL && q->next->heuristic_pq <= itprio )
                q = q->next;

            new->next = q->next;
            q->next = new;
        }
}

void del()
{
    if ( start == NULL )
    {
         printf( "\nQUEUE UNDERFLOW\n" );
    }
    else
    {
    new = start;
    printf( "\nDELETED ITEM IS %d\n", new->info );
    start = start->next;
    free( start );

    }

}

void display()
{
    temp = start;
    if ( start == NULL )
        printf( "QUEUE IS EMPTY\n" );

    else
    {
        printf( "QUEUE IS:\n" );

        while ( temp != NULL )
        {
            printf( "\t x is %d y is %d[heuristic=%lf] \n", temp->x_pq, temp->y_pq, temp->heuristic_pq );
            temp = temp->next;
        }
     }
}

您的問題在於以下代碼:

typedef struct PRIORITYQUEUE *N;
:
new = malloc( sizeof( N ) );

類型N指向您的結構的指針 ,而不是結構本身的指針 這意味着sizeof(N)可能比結構小得多,這意味着您沒有分配足夠的內存。

您可以通過在分配后立即插入以下內容來查看此內容:

printf ("%zd %zd\n", sizeof (N), sizeof (struct PRIORITYQUEUE));

並且您可能會看到一系列格式為4 328 32 ,顯示出,盡管您已分配了四個或八個字節,但您需要 32個字節。

這就是導致您崩潰的原因。 現在,關於如何修復它,只需確保為結構分配了足夠的空間,就可以使用以下任一方法來完成此操作:

new = malloc (sizeof (struct PRIORITYQUEUE));
new = malloc (sizeof (*N));

但是更喜歡的是:

new = malloc (sizeof (*new));

之所以喜歡它,是因為它將分配數量與您使用的變量聯系在一起。 盡管前兩者可以處理結構大小的任何更改,但是即使將new聲明為完全不同的結構,也可以保留下來,而不必在多個位置更改信息。

我的意思是,如果您這樣更改new的類型,則:

struct FASTER_PRIO_Q *new;

那么對於前兩種情況,您也將需要更改分配語句。 第三則不是這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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