好的,对于作业,我必须创建一个队列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-faults 返回队列;
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的: 一个错误:进程以信号11(SIGSEGV)的默认操作终止 在que_create(queueADT.c:34)的地址0x400796处对映射区域的错误权限//< - 用于返回方法的行
我已经尝试查找答案,因为我很困惑,但关于这类事情的所有问题并不像我的那么简单。我正在初始化一个结构并返回它。我尝试在初始化和cmp函数中注释掉calloc,但是同样的错误仍然存在。有什么建议?
答案 0 :(得分: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()函数。