割り当てのために、キュー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をコメントアウトしようとしましたが、同じエラーが残っていました。助言がありますか?
@ paulsm4、コンパイラは構造体をコピーすることに注意してください。彼は間違ったローカル変数へのポインタを返しません。復帰時には、構造体の値は、コンパイラが行う代入を使用してレシーバの構造体に適合させる必要があります。 –
'QueueADT'の定義を含め、最小限の完全な例を投稿してください。 – AlexP
'QueueADT'の定義を教えてください。 –