2014-11-21 76 views
-1

当我做queue_arr [i] = queue_create()时,我突然想到了段错误的原因,一切似乎都没事。我用调试器检查了queue_create()返回实际的队列。内存分配给一个新的队列..不知道可能是什么原因!需要帮忙。在我的C代码中出现段错误的原因是什么?

这里是主要的代码片段:

queue_t **queue_arr; 
global_array_of_queues = queue_arr; 
int i = 0; 
for(i = 0; i < number_of_categories; i++){ 
    queue_arr[i] = queue_create(); //<<<------!!! segfault here 
} 

这里是功能:

queue_t *queue_create() { 
    queue_t *new_queue = calloc(1, sizeof(queue_t)); 
    if (new_queue == NULL){ 
     perror("calloc failed to allocate memory. \n"); 
     exit(-1); 
    } 

    if (pthread_mutex_init(&new_queue->mutex, NULL) != 0) { 
     perror("pthread_mutex_init failed. \n"); 
     exit(-1); 
    } 
    if (pthread_cond_init(&new_queue->wait_for_not_empty_queue, NULL) != 0) { 
     /* signal for our consumers */ 
     perror("pthread_cond_init failed. \n"); 
     exit(-1); 
    } 
    if (pthread_cond_init(&new_queue->wait_for_empty_queue, NULL) != 0) { 
     /* signal for our producer */ 
     perror("pthread_cond_init failed. \n"); 
     exit(-1); 
    } 
    new_queue->category = NULL; 
    new_queue->rear = NULL; 

    return new_queue; 
} 

队列类型:

typedef struct queue { 
    pthread_mutex_t mutex; 
    pthread_cond_t wait_for_not_empty_queue; 
    pthread_cond_t wait_for_empty_queue; 
    char *category; 
    struct queue_node *rear; 
} queue_t; 

不知道这是否会影响的东西,但我还声明全局指针指向我的队列:

extern queue_t **global_array_of_queues; 

enter image description here

+1

'queue_arr'没有指向任何有效位置,更不用说'queue_arr [i]'。 – hobbs 2014-11-21 16:59:30

+0

它看起来不像你初始化'queue_arr'本身。 – Michael 2014-11-21 16:59:38

+1

您需要为'queue_arr'分配内存以指向。目前它尚未初始化,因此取消引用是非法的。 – 2014-11-21 16:59:40

回答

2

queue_arr未初始化。在进入for-loop之前,您需要在堆上预留内存。

+0

哦yesss ...我需要初始化指向队列的指针。 .. – YohanRoth 2014-11-21 17:01:23

1

您的queue_arr未分配,因此分配queue_arr[i]您违反了内存。

相关问题