2011-05-06 107 views
1
#include <stdio.h> 
#include <pthread.h> 
#include <time.h> 
#include <stdlib.h> 

typedef struct pr_struct{ 
    int owner; 
    int burst_time; 
    struct pr_struct *next_prcmd; 
} prcmd_t; 

static prcmd_t *pr_head = NULL; 
static prcmd_t *pr_tail = NULL; 
static int pending_request = 0; 
static pthread_mutex_t prmutex = PTHREAD_MUTEX_INITIALIZER; 


int add_queue(prcmd_t *node) 
{  
    pthread_mutex_lock(&prmutex); 
    //code 
    prcmd_t *curNode = pr_head; 
    if(pr_head == NULL) { pr_head = node; return;} 
    while(curNode->next_prcmd) 
    { 
     curNode->next_prcmd = (prcmd_t*)malloc(sizeof(prcmd_t)); 
     curNode = curNode->next_prcmd; 
    } 
    curNode->next_prcmd = node; 

    // 
    pending_request++; 
    pthread_mutex_unlock(&prmutex); 
    return(0); 
} 



int main() 
{ 
    if (pr_head == NULL) 
    { 
     printf("List is empty!\n"); 
    } 

    prcmd_t *pr1; 
    pr1->owner = 1; 
    pr1->burst_time = 10; 
    add_queue(pr1); 
    prcmd_t *curNode = pr_head; 
    while(curNode->next_prcmd) 
    { 
     printf("%i\n", curNode->owner); 
     curNode = curNode->next_prcmd; 
    } 
} 

編輯:爲什麼我在這裏得到分割錯誤?

這是我現在有...

int main() 
{ 


prcmd_t *pr1; 
pr1 = (prcmd_t*)malloc(sizeof(prcmd_t)); 
pr1->owner = 1; 
pr1->burst_time = 10; 



if (pr_head == NULL) 
{ 

    printf("List is empty!\n"); 
} 

add_queue(pr1); 


prcmd_t *curNode = pr_head; 

printf("made it here 1\n"); 
while(curNode->next_prcmd) 
{ 
    printf("in the while loop\n"); 

    printf("%i\n", curNode->owner); 
    curNode = curNode->next_prcmd; 
} 
} 

輸出是: 列表是空的! 使它這裏1

+2

你在哪裏得到段錯誤? – QuantumMechanic 2011-05-06 04:18:43

+0

我不知道。當我運行主。獲取stdout中的seg錯誤。 – Pulseczar 2011-05-06 04:28:18

+0

然後在調試器下運行它。或者啓用核心轉儲,當你獲得核心時,運行一個調試器並查看堆棧跟蹤。 – QuantumMechanic 2011-05-06 04:29:31

回答

4

pr1是未初始化的指針到prcmd_t struct,解除引用初始化指針導致undefined behavior

需要爲堆/堆棧上的結構分配空間(取決於它的會被使用),因此,一種選擇是:

// Allocate on stack 
prcmd_t pr1; 
pr1.owner = 1; 
pr1.burst_time = 10; 
add_queue(&pr1); 

和第二是:

//Allocae on heap 
prcmd_t *pr1; 
pr = (prcmd_t*)malloc(sizeof(prcmd_t)); 
pr1->owner = 1; 
pr1->burst_time = 10; 
add_queue(pr1); 

修改你的主要方法(只有主)到:

int main() 
{ 
    if (pr_head == NULL) 
    { 
     printf("List is empty!\n"); 
    } 

    prcmd_t *pr1; 
    pr1 = (prcmd_t*)malloc(sizeof(prcmd_t)); 
    pr1->owner = 1; 
    pr1->burst_time = 10; 
    add_queue(pr1); 
    prcmd_t *curNode = pr_head; 
    while(curNode && curNode->owner) 
    { 
     printf("%i\n", curNode->owner); 
     curNode = curNode->next_prcmd; 
    } 
} 

輸出

List is empty! 
1 
+0

所以你有另一個地方有同樣的問題。看看add_queue函數。 – MByD 2011-05-06 04:27:30

+0

選項2修復了seg故障 – Pulseczar 2011-05-06 04:37:23

+0

我認爲你混合了我給你的兩個選項。由於'add_queue'需要一個指向'prcmd_t'('prcmd_t *')的指針,如果你將'pr1'聲明爲'prcmd_t',那麼你需要將它的指針'(&pr1)'傳遞給'add_queue',但是如果你將其聲明爲'prcmd_t *',那麼它已經是一個指向'prcmd_t'的指針,並且您不需要傳遞它的指針,而是將它本身('pr')傳遞給add_queue。 – MByD 2011-05-06 04:47:54

2

很難說沒有你tellung我們哪裏...

  • 你必須初始化 節點 - > next_prcmd爲null
  • 爲什麼你的malloc的同時,循環?你 從而destroing的電流 - >接下來, 在其下一次迭代是相當 壞...

馬里奧

+0

我應該在哪裏malloc?我需要嗎?? – Pulseczar 2011-05-06 04:33:42

+0

好的,是的。我現在看到了。現在要解決它...輸出只是「列表爲空」 – Pulseczar 2011-05-06 04:37:55

+0

MBYD指出刪除main(),malloc pr1中的if! – 2011-05-06 04:50:59