返回结构时的分段错误

时间:2017-04-15 17:17:06

标签: c struct segmentation-fault

好的,对于作业,我必须创建一个队列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,但是同样的错误仍然存​​在。有什么建议?

1 个答案:

答案 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()函数。