2014-11-21 108 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]您違反了內存。

相關問題