Почему я получаю ошибку сегментации здесь?

#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


person Pulseczar    schedule 06.05.2011    source источник
comment
Где вы берете segfault?   -  person QuantumMechanic    schedule 06.05.2011
comment
Не знаю. Когда я запускаю main. Получите ошибку seg в stdout.   -  person Pulseczar    schedule 06.05.2011
comment
Затем запустите его под отладчиком. Или включите дампы ядра и когда получите ядро, запустите на нем отладчик и посмотрите трассировку стека.   -  person QuantumMechanic    schedule 06.05.2011
comment
Я не знаю, как это сделать. Я новичок в использовании unix.   -  person Pulseczar    schedule 06.05.2011
comment
segfault обычно является попыткой доступа к памяти, которую ЦП не может физически адресовать   -  person Shweta    schedule 06.05.2011
comment
См. stackoverflow.com/questions/2588853/ для некоторых очень полезных деталей GDB   -  person QuantumMechanic    schedule 06.05.2011
comment
И stackoverflow.com/questions/2069367/how-to- debug-using-gdb для некоторых основных советов по началу работы.   -  person QuantumMechanic    schedule 06.05.2011


Ответы (2)


pr1 — это неинициализированный указатель на prcmd_t struct, разыменование неинициализированного указателя вызывает неопределенное поведение.

Вам нужно выделить место для структуры в куче/стеке (в зависимости от того, где она будет использоваться), поэтому один из вариантов:

// 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
person MByD    schedule 06.05.2011
comment
Итак, у вас есть еще одно место с той же проблемой. посмотрите также на функцию add_queue. - person MByD; 06.05.2011
comment
Я думаю, вы смешали два варианта, которые я вам дал. Поскольку add_queue ожидает указатель на prcmd_t (prcmd_t *), если вы объявите pr1 как prcmd_t, вам нужно будет передать его указатель (&pr1) на add_queue, но если вы объявите его как prcmd_t *, то это уже указатель на prcmd_t, и вы не нужно передать свой указатель, а себя (pr) в add_queue. - person MByD; 06.05.2011
comment
список по-прежнему не печатается int main() { prcmd_t pr1; pr1 = (prcmd_t)malloc(sizeof(prcmd_t)); pr1-›владелец = 1; pr1-›burst_time = 10; add_queue (pr1); if (pr_head == NULL) { printf(Список пуст!\n); } prcmd_t *curNode = pr_head; printf(сделано здесь 1\n); while(curNode-›next_prcmd) { printf(в цикле while\n); printf(%i\n, curNode-›владелец); curNode = curNode-›next_prcmd; } } - person Pulseczar; 06.05.2011
comment
Опять же, вы объявили pr1 как структуру, но вместо этого без какой-либо причины обращаетесь с ней как с указателем. - person MByD; 06.05.2011
comment
@Pulseczar - отредактировав свой ответ, но, пожалуйста, добавьте его внизу и упомяните, что это редактирование - person MByD; 06.05.2011
comment
Я весьма озадачен. Я подумал, что мне нужно выделить его. Когда я комментирую эту строку, возвращается ошибка seg. - person Pulseczar; 06.05.2011
comment
@MByD Я внес правку. Есть ли простой способ отформатировать код или добавить 4 пробела впереди? Очень раздражает необходимость вручную добавлять 4 пробела в каждую строку. - person Pulseczar; 06.05.2011
comment
@Pulseczar, во-первых, посмотрите мой отредактированный ответ, во-вторых, да, отметьте код, который вы хотите отформатировать, и нажмите ctrl+k или щелкните скобки на панели редактирования. - person MByD; 06.05.2011
comment
@MByD Большое спасибо. Теперь ты меня на правильном пути. Я обязательно вернусь еще, но большое спасибо. - person Pulseczar; 06.05.2011
comment
@Pulseczar - нет проблем, если этот ответ вас удовлетворил, отметьте его как принятый, поставив галочку слева от него. - person MByD; 06.05.2011

Трудно сказать, если вы не сказали нам, где...

Но

  • вам нужно инициализировать node->next_prcmd до нуля
  • почему вы используете malloc в цикле while? тем самым вы уничтожаете свой текущий- > следующий, что в следующей итерации довольно плохо...

Марио

person Mario The Spoon    schedule 06.05.2011
comment
Где я должен malloc? Нужно ли мне.? - person Pulseczar; 06.05.2011
comment
Да, хорошо. Я вижу это сейчас. Теперь, чтобы исправить это... Вывод только Список пуст - person Pulseczar; 06.05.2011