2017-04-15 65 views
0

好的,爲了完成一個任務,我必須創建一個隊列ADT,但是我的代碼在開始時失敗。返回結構時出現分段錯誤

每個測試的第一個方法調用是que_create,這是什麼seg-faulting。下面是該方法:

QueueADT que_create(int (*cmp)(const void *a, const void *b)) { 
    QueueADT queue = {0, 0, 1, 10, 0, calloc(10, sizeof(void *)), cmp}; 
    return queue; 
} 

的結構:在含 返回隊列中的線

typedef que_adt { 
    unsigned int head; 
    unsigned int rear; 
    unsigned int empty; 
    unsigned int capacity; 
    unsigned int nitems; 
    void **array; 
    int (*cmp)(const void *a, const void *b); 
} QueueADT; 

方法SEG-故障;

GDB: 隊列初始化和返回行的斷點。 之前

queue = {head = 0, rear = 0, empty = 0, capacity = 0, nitems = 0, array = 0xff0000000000000000, cmp = 0x1} 

queue = {head = 0, rear = 0, empty = 1, capacity = 10, nitems = 0, array = 0x603010, cmp = 0x7ffffffffe938} 

Valgrind的: 一個錯誤:過程有用於映射區域在地址0x400796在que_create( 爲權限queueADT.c信號的默認動作11(SIGSEGV)結束: 34)// < - 線路返回的方法

我試過尋找答案,因爲我很困惑,但所有關於這類問題ing並不像我的那麼簡單。我從字面上初始化一個結構並返回它。我試着在初始化和cmp函數中註釋掉calloc,但同樣的錯誤依然存在。有什麼建議麼?

+3

@ paulsm4,注意編譯器會複製結構。他不會返回(指向)局部變量,這是錯誤的。返回時,結構的值必須與使用賦值的接收器的結構編譯在一起,編譯器會這樣做。 –

+4

請發佈一個最小的完整示例,包括'QueueADT'的定義。 – AlexP

+1

你能告訴我們'QueueADT'的定義嗎? –

回答

0

此代碼工作:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct que_adt { 
    unsigned int head; 
    unsigned int rear; 
    unsigned int empty; 
    unsigned int capacity; 
    unsigned int nitems; 
    void **array; 
    int (*cmp)(const void *a, const void *b); 
} QueueADT; 

int 
compare(const void *a, const void *b) 
{ 
    return 1; 
} 

QueueADT que_create(int (*cmp)(const void *a, const void *b)) { 
    QueueADT queue = {0, 0, 1, 10, 0, calloc(10, sizeof(void *)), cmp}; 
    return queue; 
} 

int 
main(void) 
{ 
     QueueADT q = que_create(compare); 

     return 0; 
} 

在gdb的,我輸入 'P Q',我得到了

(gdb) p q 
$1 = {head = 0, rear = 0, empty = 1, capacity = 10, nitems = 0, array = 0x602010, cmp = 0x40052d <compare>} 

沒有你的代碼,這一個太大的區別。我複製並粘貼它。唯一的區別是我必須定義一個虛擬compare()函數。