2017-04-15 12 views
0

割り当てのために、キューADTを作成する必要がありますが、私のコードは非常に最初に失敗しています。構造体を返す際のセグメンテーションフォールト

すべてのテストの最初のメソッド呼び出しは、seg-faultingであるque_createです。ここで方法は次のとおりです。

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: キューの初期化と戻り行のブレークポイント。 一エラー:プロセスは、信号のデフォルトアクション11(SIGSEGV)que_createのアドレス0x400796にマッピングされた領域について 不正アクセス許可(queueADT.cで終端

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の前後。 34)// < - メソッドを返すための行

私は非常に混乱しているので、これに対する答えを見出そうとしましたが、この種の質問に関するすべての質問私のものほど単純ではありません。私は文字通りstructを初期化して返しています。初期化と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を' 入力されたと私はあなたのコードと、この1との大きな違いはありません

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

を得ました。私はそれをコピーして貼り付けた。唯一の違いは、ダミーのcompare()関数を定義しなければならないことです。