在尝试将struct传递给函数时保持segfaulting

时间:2013-10-09 19:20:17

标签: c gcc

我正在尝试将指向队列的指针传递给createQueue函数:

void createQueue(struct pqueue *queue){
    queue = malloc( sizeof(struct pqueue) );  
    queue->root = malloc(sizeof(struct node));
    queue->root->next = 0;   
    queue->root->taskID = 12;
    queue->root->priority = 5000;
}

我也尝试像这样添加到新创建的队列中:

void add(struct pqueue *queue, int taskID, int priority){
struct node *conductor;
conductor = queue->root;
if ( conductor != 0 ) {
        while ( conductor->next != 0)
        {
                conductor = conductor->next;
        }
}
 conductor->next = malloc( sizeof(struct node) );  
 conductor = conductor->next;
 if ( conductor == 0 )
  {
      printf( "Out of memory" );
  }
  /* initialize the new memory */
  conductor->next = 0;         
  conductor->taskID = taskID;
  conductor->priority = priority;
}

来自主要功能:

int main()
{
    struct pqueue *queue;       

    createQueue(queue);
    add(queue, 234093, 9332);
}

...但我保持segfaulting。为什么这种情况一直在发生?

编辑:

pqueue和node的结构如下:

struct node {
  int taskID;
  int priority;
  struct node *next;
};

struct pqueue{
  struct node *root;
};

1 个答案:

答案 0 :(得分:4)

在C中,所有内容都按值传递。因此,当您致电createQueue(queue)时,您正在将指针的副本传递给该函数。然后,在函数内部,当您说queue = malloc(...)时,您将指针的复制设置为等于新分配的内存 - 留下main()的副本指针不变。

你想做这样的事情:

void createQueue(struct pqueue **queue)
{
    (*queue) = malloc( ... );
}

int main(void)
{
    struct pqueue *queue;

    createQueue(&queue);
}

This question更详细地描述了您的错误。