2011-05-06 103 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