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,但同樣的錯誤依然存在。有什麼建議麼?
@ paulsm4,注意編譯器會複製結構。他不會返回(指向)局部變量,這是錯誤的。返回時,結構的值必須與使用賦值的接收器的結構編譯在一起,編譯器會這樣做。 –
請發佈一個最小的完整示例,包括'QueueADT'的定義。 – AlexP
你能告訴我們'QueueADT'的定義嗎? –